Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] problem z wyrażeniem regularnym
Forum PHP.pl > Forum > Przedszkole
basstone
Witam

Próbuję za pomocą wyrażeń regularnych wyciągnąć treść znajdującą się pomiędzy tagami <b></b>, <strong></strong> oraz <i></i>. Moje wyrażenie wygląda tak:


  1. $wzorzec = '</^<[(b|strong|i|u)]+>[a-zA-Z0-9.\-]+</[(b|strong|i|u)]$/>'; // linia 63
  2. preg_match_all($wzorzec, $kodstrony, $tresc, PREG_PATTERN_ORDER); // linia 64


Na stronie wyrzuca mi błąd:
Warning: preg_match_all() [function.preg-match-all]: Unknown modifier '[' on line 64

Czy ktoś mógłby mi wyjaśnić gdzie popełniam błąd? Czytam tutorial za tutorialem i nadal nie mogę dojść do ładu :/
Necsord
http://www.php.net/manual/en/regexp.reference.delimiters.php
W zależności od potrzeb zastanów się czy nie bardziej się tobie opłaca użycie DOMDocument.
basstone
Ok, ogarnąłem delimitery, ale dlaczego takie wzorzec nie wyświetla mi żadnych wyników?

  1. $wzorzec = '#^\<[a-zA-Z]+\>$#';
Necsord
Ten wzorzec zadziała dla wyrażeń które zaczynają się od < później mają przynajmniej 1 literę, a na końcu znak >. Czyli przykładowo:
<cokolwiek> - tak
<c> - tak
<c dwq> - nie
<> - nie
cokolwiek> - nie

Za wskazanie początku i końca odpowiada odpowiednio ^ i $.
basstone
czyli w teorii powinien wyświetlić mi wszystkie znaki <b> z kodu strony prawda? a nie wyświetla nic mimo, że są :/
Potrzebuję wyciągnąć wszystko spomiędzy tagów <b></b>, <strong></strong>, <i></i> i cokolwiek nie piszę ani razu nie działa, a opieram się na przykładach i instrukcjach z http://pl.wikibooks.org/wiki/PHP/Podstawy_...%84_regularnych
Necsord
Twoje wyrażenie regularne jest błędne ponieważ ciąg znaków typu:
costam <b> cos tam</b>
nie zaczyna się od < tylko od "costam".

  1. $testCases = array(
  2. '<b> costam </b>' => 'true',
  3. '<strong> costam </strong>' => 'true',
  4. '<i> costam </i>' => 'true',
  5. '<i> costam <strong> costam2 </strong> </i>' => 'true',
  6. 'costam<i>cos</i>costam' => 'true',
  7. 'costam <i>cos</i> costam' => 'true',
  8. 'costam <a>cos</a> costam' => 'false',
  9. 'costam <i></i> costam' => 'false', // bo puste
  10. );
  11. $pattern = '#<([b|strong|i])>(?<wartosc>.+)</\1>#';

Z uwagą, że to nie złapie zagnieżdżonych.
basstone
Nie będę zakładał nowego tematu więc dopiszę jeszcze tutaj.

Otóż to, mam taką tablicę i wyrażenie:

  1. $del = array("a", "aby", "ach", "acz", "aczkolwiek", "aj", "albo", "ale", "ależ", "ani", "aż", "bardziej", "bardzo", "bez", "bo", "bowiem", "by", "byli", "bynajmniej", "być", "był", "była", "było", "były", "będzie", "będą", "cali", "cała", "cały", "ci", "cię", "ciebie", "co", "cokolwiek", "coś", "czasami", "czasem", "czemu", "czy", "czyli", "daleko", "dla", "dlaczego", "dlatego", "do", "dobrze", "dokąd", "dość", "dużo", "dwa", "dwaj", "dwie", "dwoje", "dziś", "dzisiaj", "gdy", "gdyby", "gdyż", "gdzie", "gdziekolwiek", "gdzieś", "go", "i", "ich", "ile", "im", "inna", "inne", "inny", "innych", "iż", "ja", "ją", "jak", "jakaś", "jakby", "jaki", "jakichś", "jakie", "jakiś", "jakiż", "jakkolwiek", "jako", "jakoś", "je", "jeden", "jedna", "jedno", "jednak", "jednakże", "jego", "jej", "jemu", "jest", "jestem", "jeszcze", "jeśli", "jeżeli", "już", "ją", "każdy", "kiedy", "kilka", "kimś", "kto", "ktokolwiek", "ktoś", "która", "które", "którego", "której", "który", "których", "którym", "którzy", "ku", "lat", "lecz", "lub", "ma", "mają", "mało", "mam", "mi", "mimo", "między", "mną", "mnie", "mogą", "moi", "moim", "moja", "moje", "może", "możliwe", "można", "mój", "mu", "musi", "my", "na", "nad", "nam", "nami", "nas", "nasi", "nasz", "nasza", "nasze", "naszego", "naszych", "natomiast", "natychmiast", "nawet", "nią", "nic", "nich", "nie", "niego", "niej", "niemu", "nigdy", "nim", "nimi", "niż", "no", "o", "obok", "od", "około", "on", "ona", "one", "oni", "ono", "oraz", "oto", "owszem", "pan", "pana", "pani", "po", "pod", "podczas", "pomimo", "ponad", "ponieważ", "powinien", "powinna", "powinni", "powinno", "poza", "prawie", "przecież", "przed", "przede", "przedtem", "przez", "przy", "roku", "również", "sam", "sama", "są", "się", "skąd", "sobie", "sobą", "sposób", "swoje", "ta", "tak", "taka", "taki", "takie", "także", "tam", "te", "tego", "tej", "ten", "teraz", "też", "to", "tobą", "tobie", "toteż", "trzeba", "tu", "tutaj", "twoi", "twoim", "twoja", "twoje", "twym", "twój", "ty", "tych", "tylko", "tym", "u", "w", "wam", "wami", "was", "wasz", "wasza", "wasze", "we", "według", "wiele", "wielu", "więc", "więcej", "wszyscy", "wszystkich", "wszystkie", "wszystkim", "wszystko", "wtedy", "wy", "właśnie", "z", "za", "zapewne", "zawsze", "ze", "zł", "znowu", "znów", "został", "żaden", "żadna", "żadne", "żadnych", "że", "żeby",);
  2.  
  3. $out = preg_replace("#(^$del,|,$del$)#", '', $in);
  4. $czysty = preg_replace("#(,$del,)#", ',', $out);
  5. return $czysty;


Chciałbym aby przez preg_replace zastępowano tylko całe słowa, a nie ich fragmenty. Niestety to wyrażenie nie chce mi zadziałać, a dalej nie mogę dojść do ładu z wyr. regularnymi.

Zmienna $czysty cały czas zwraca taki sam tekst jak $in :|
by_ikar
Zastanów się w jaki sposób przekazujesz tą tablicę. Weź sobie to:

  1. echo "#(^$del,|,$del$)#";


i wyświetl to sobie, a się przekonasz jakie piękne wyrażenie dostajesz i dlaczego nie może zostać dopasowane.

Druga sprawa to jest taka że ciężko ci będzie stworzyć wyrażenie które się domyśli że to jest cały wyraz a nie tylko jego część. Raczej będziesz musiał szukać wyrazu który jest poprzedzony spacją i zakończony spacją lub kropką, lub przecinkiem. Czyli przewidywanie pozytywne.

Do preg_replace, można przekazać tablicę jako argument, ale nie w taki sposób jak ty to robisz.
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.