Skocz do zawartości

Curl i wyrażenia regularne


Kirgo

Rekomendowane odpowiedzi

Zaczałem się bawić Curlem i wyr. regularnymi.

Postawiłem sobie prostą jedną stronę, którą pobieram curlem.

W kodzie są prawidłowe nagłówki, dałem link do styli i przykładowy java skrypt.

$adres="www.mojastrona.pl/rob.html";

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $adres);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
$strona = curl_exec($curl);

Cały kod, który mam w $strona chciałbym teraz przerobić preg_replace. No i tu się zaczyna. Wygląda na to, że preg_replace nie chce przyjąć zmiennej $strona.

Chciałbym wyciąć kod od pierwszego znaku, czyli: <!DOCTYPE HTML PUBLIC itd...

aż do diva zdefiniowanego jako <div class="Koniec"> zamienić go na <div class="Poczatek"> i to co jest dalej pozostawić.

Kod:

$wzorzec = '/*(<div class="Koniec">)$/';

$tekst = preg_replace($wzorzec, '<div class="Poczatek">', $strona);

daje mi komunikat błędu

Warning: preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 0

Jak powinienem napisać wzorzec, aby zadziałało? Nie mam już pomysłów.

Podejrzewam, że trzeba by też zabezpieczyć regułę, bo w kodzie są znaki wszelakie, tzn. ' " czy -

Odnośnik do komentarza
Udostępnij na innych stronach

1) $adres powinien zaczynać się od https://

2) Pamiętaj, że w wyrażeniach regularnych trzeba uważać na znaki we wzorcu, w twoim przypadku komunikat błędu dotyczy znaku "<", który odpowiedzialny jest za rekurencję i powinien zostać escapeowany: \< .

3) Do takich zadań nie używa się wyrażeń regularnych. Użyj takiej konstrukcji:

$tekst = str_replace('<div class="Koniec">', '<div class="Poczatek">', $strona);

https://pl.php.net/str_replace

Sprawdź liderów systemów wymiany linków:

linkme.pl (stały), gotlink.pl (rotacyjny)

alexain.jpgalexaol.jpgalexaat.jpg

Odnośnik do komentarza
Udostępnij na innych stronach

Warning: preg_replace() [function.preg-replace]: Compilation failed: nothing to repeat at offset 0

$wzorzec = '/*(<div class="Koniec">)$/';

postawiłeś znak * bez poprzedzającej klasy, znaku (.,[a-Z],\w itd) dlatego powstaje błąd, jeżeli w tekście masz * to wtedy używasz \*.

Prawidłowo twój wzorzec powinien wyglądać tak jak Irek napisał lub zmieniając odrobinę twoją wersję:

$wzorzec = '/(.*<div class="Koniec">)/';
$tekst = preg_replace($wzorzec, '<div class="Poczatek">', $strona);

W przypadku preg_replace nawiasami przechwytujesz ten fragment ciągu który ma zostać zamieniony. Jeżeli chcesz z powrotem umieścić ponownie przechwycony fragment ciągu kolejne wartości uzyskane z nawiasów są w kolejnych zmiennych \1 \2 \3 itd

.* - to najdłuższy cią dowolnych znaków pasujących do wzorca, a .*? to najkrótszy ciąg dowolnych znaków.

Jeżeli w tekście miałbyś wielokrotnie <div class="Początek"> to w zależności jaką część chciałbyś przechwycić używasz .* lub .*? lub mniej ogólnych wyrażeń.

powinien zostać escapeowany: \< .

nie trzeba, ale ja też nadmiarowo escapuje :)

nihil fit sine causa

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności