Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] problem z wyrażeniem regularnym
basstone
post 19.02.2012, 19:07:43
Post #1





Grupa: Zarejestrowani
Postów: 40
Pomógł: 6
Dołączył: 20.12.2011

Ostrzeżenie: (0%)
-----


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 :/

Ten post edytował basstone 19.02.2012, 19:08:58
Go to the top of the page
+Quote Post
Necsord
post 19.02.2012, 19:55:23
Post #2





Grupa: Zarejestrowani
Postów: 189
Pomógł: 60
Dołączył: 5.10.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
basstone
post 19.02.2012, 20:17:45
Post #3





Grupa: Zarejestrowani
Postów: 40
Pomógł: 6
Dołączył: 20.12.2011

Ostrzeżenie: (0%)
-----


Ok, ogarnąłem delimitery, ale dlaczego takie wzorzec nie wyświetla mi żadnych wyników?

  1. $wzorzec = '#^\<[a-zA-Z]+\>$#';
Go to the top of the page
+Quote Post
Necsord
post 19.02.2012, 20:26:59
Post #4





Grupa: Zarejestrowani
Postów: 189
Pomógł: 60
Dołączył: 5.10.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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 $.

Ten post edytował Necsord 19.02.2012, 20:27:31
Go to the top of the page
+Quote Post
basstone
post 19.02.2012, 20:29:42
Post #5





Grupa: Zarejestrowani
Postów: 40
Pomógł: 6
Dołączył: 20.12.2011

Ostrzeżenie: (0%)
-----


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

Ten post edytował basstone 19.02.2012, 20:32:17
Go to the top of the page
+Quote Post
Necsord
post 19.02.2012, 20:59:49
Post #6





Grupa: Zarejestrowani
Postów: 189
Pomógł: 60
Dołączył: 5.10.2010
Skąd: Bydgoszcz

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
basstone
post 20.02.2012, 01:10:55
Post #7





Grupa: Zarejestrowani
Postów: 40
Pomógł: 6
Dołączył: 20.12.2011

Ostrzeżenie: (0%)
-----


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 :|
Go to the top of the page
+Quote Post
by_ikar
post 20.02.2012, 08:23:32
Post #8





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.06.2025 - 06:22