Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] [preg_replace() i wyrażenia regularne [Rozw.]
Forum PHP.pl > Forum > Przedszkole
wujek_bogdan
Chcę wyszukać i zamienić tekst znajdujący się pomiędzy dwoma komentarzami np. pomiędzy i
tzn interesuje mnie usunięcie zawartości pomiędzy tymi tagami - całej zawartości, bez względu na to co się tam znajdzie.
piszę sobie:
Kod
$poczatek ='<!--napis3-->';
$koniec = '<!--napis3koniec-->';
$wynik = preg_replace($poczatek(.*)$koniec,'DUPA', $tu_jakaś_zmienna_w_której_trzymam_tekst);

...ale nie bardzo chce to działać.
nie moge dojsc do ladu z wyrażeniami regularnymi. nie znalazlem jeszcze dobrego, prostego, łopatologicznego poradnika.
na pewno muszę użyć * ... tylko nie wiem jak ma wyglądać składnia.
kamil4u
Kod
$wynik = preg_replace(#$poczatek."(.*)".$koniec#,'DUPA', $tu_jakaś_zmienna_w_której_trzymam_tekst);
lub jak nie będzie działało:
Kod
$wynik = preg_replace("#$poczatek(.*)$koniec#",'DUPA', $tu_jakaś_zmienna_w_której_trzymam_tekst);
? Dawno się nie bawiłem z tym to dokładnie nie pamiętam smile.gif - http://bedkowski.pl/a/php_regex/
wujek_bogdan
niestety, ani jedno ani drugie nie działa.
btw, co robi znak #
?
trike
a nie powinno to byc w znacznikach /$poczatek(.*)$koniec/

albo jeszcze inaczej
  1. <?php
  2. $wzor = '/^$poczatek .* $koniec$/';
  3. $zamiennik = 'cos tam';
  4. preg_replace($wzor, $zamiennin, $tekst);
  5. ?>
wujek_bogdan
też nie bardzo :/
Bart77
Pewien programista miał problem, więc użył wyrażeń regularnych. I teraz ma dwa problemy... winksmiley.jpg

Jeśli zależy Ci na czasie, to zamiast rozgryzać preg spróbuj klasycznych metod z epoki pehapa łupanego:

  1. <?php
  2. $poczatek ='<!--napis3-->';
  3. $koniec = '<!--napis3koniec-->';
  4. $tresc = 'straty taty <!--napis3--> bla<!--napis3koniec--> bla <!--napis3--> uuu 44ed*^&F<!--napis3koniec--> !!!!!!!';
  5. $zamiennik = 'DUPA';
  6.  
  7. $replacement = array();
  8.  
  9. $split1 = explode($poczatek, $tresc);
  10. foreach ( $split1 as $part ) {
  11.    if ( strstr($part, $koniec) ) {
  12.        list($tmp) = explode($koniec, $part);
  13.        $replacement[] = $tmp;
  14.    }
  15. }
  16.  
  17. $output = $tresc;
  18.  
  19. foreach ( $replacement as $element ) {
  20.    $output = str_replace($poczatek.$element.$koniec, $poczatek.$zamiennik.$koniec, $output);
  21. }
  22. var_dump($tresc);
  23. echo '<br />';
  24. var_dump($output);
  25. ?>
zegarek84
  1. <?php
  2. $poczatek ='<!--napis3-->';
  3. $koniec = '<!--napis3koniec-->';
  4.  
  5. $wyrazenie='/'.$poczatek.'.*?'.$koniec.'/is';
  6. $wynik = preg_replace($wyrazenie,'DUPA',$tu_jakaś_zmienna_w_której_trzymam_tekst);
  7. ?>


propozycja kamil4u byla dobra ale zapewne Ty masz i należało się spodziewać kod w kilku linijkach - więc trzeba było dodać tylko odpowiednie modyfikatory na końcu wyrażenia - pozatym zapomniał o zachłanności wyrażeń regularnych bądź z góry założył że jest tylko jedna para komentaży tego typu winksmiley.jpg
wujek_bogdan
thx @Bart77
zostane jednak przy wyrazeniach regularnych. Sposob podany przez zegarek84 też dziala i wydaje się być wydajniejszy.
Jako, ze nie lubie robic czegos na oslep, a otrzymalem gotowe rozwiazanie, czy moze mi teraz ktos wyjasnic po co na poczatku jest '/' i czemu na koncu jest '/is'
i jeszcze po co po gwazdce dawac pytajnik, skoro gwiazdka zastepuje dowolny ciag znakow?

z gory dzieki, po prostu wole wiedziec co robie...a predzej czy pozniej trzeba bedzie przebrnąć przez wyrażenia regularne. Wydaje się to nie być trudne, tylko zapis jest cholernie nieczytelny.
zegarek84
znacznikami / obejmuje się całe wyrażenie regularne - możesz zamiast tego urzyć # lub | (ale drugiego odradzam gdyż jest symbolem specjalnym i znaczy dosłownie "lub") - całośc najlepiej objąć pojedyńczym symbolem gdyz wtedy można np. bez problemu wprowadzać spację i masz 100% pewności że wszystko bedzie tekstem - \ - tym odwróconym poprzedza się wszystkie symbole specjalne jeśli one mają byc wyszukane w tekście (czyli jesli nie maja pełnić swojej funkcji)...

te znaki końcowe iu.... i - pomijasz wielkość liter (nieraz pisząc szybko ktoś pisze z małych a szuka w tekście gdzie nieraz jest to z dużej litery - zazwyczaj takie też się chce wyszukać...
s - wyszukuje włącznie z nową linią - bez tego traktuje nową linie jako koniec ciągu w którym szukasz wyrażenia

nie stosowałem początku ciagu czyli ^ bo szukałeś w całym tekście, znak $ oznacza zakończenie dopasowanie - to jeśli idealnie chcialbyś dopasować wyrażenie regularne....

polecam kurs coprawda z js ale dobry:
http://www.doman.art.pl/kursjs/kurs/regular.html

co do pytajnika po gwiazdce to wpisz w google "zachłanność wyrażeń regularnych" i przejrzyj wyniki wyszukiwania - polecam link ale teraz coś nie działa (dlatego poszukaj pod tym hasłem w google):
http://wyrazenia-regularne.pl/

dla przykładu jeśli masz tekst:
gsfa<b>fsfssaf</b>fsdfdsfas<b>rfafaqf</b>ffafa

to bez dodatkowego znaku zapytania wyrażenie '/<b>.*<\/b>/' dopasuje się wyrażenie do toego co najwiecej będzie mogło - a więc do:
<b>fsfssaf</b>fsdfdsfas<b>rfafaqf</b>

zaś przy tym dodatkowym znaku zapytania szuka za koleją po pierwszym dopasowaniu i dopasuje sie do:
<b>fsfssaf</b>
oraz:
<b>rfafaqf</b>

jakby nie było różnica spora - a ja nie miałem pewności czy nie masz więcej par tego typu komentarzy to bezpieczniej było urzyć z pytajnikiem bo inaczej wycieło by Ci po drodze wszystko co by znalazło od pierwszego do ostatniego dopasowania...

pozdro...
wujek_bogdan
dzięki za wyczerpującą odpowiedź. ciężko przebrnąć przez te wyrażenia regularne, szczególnie gdy opisy w internecie nie są wyczerpujące, albo pomijają pewne podstawowe kwestie zakładając, że czytelnik już je zna.

thx!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.