Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [preg_match_all] złe parsowanie
Forum PHP.pl > Forum > PHP
sebekzosw
Witam,

mam skrypt:

  1. $content = 'To jest [code-one word="test"]problematyczne[/code-one] super [code-one word="hehe"]zadanie[/code-one]. Które źle działa';
  2.  
  3. preg_match_all('/\[code-one word="(.*)"](.*)\[\/code-one]/i', $content, $matches);
  4.  
  5. echo '<pre>';
  6. print_r($matches);
  7. echo '</pre>';


efekt:

Kod
Array
(
    [0] => Array
        (
            [0] => [code-one word="test"]problematyczne[/code-one] [code-one word="hehe"]zadanie[/code-one]
        )

    [1] => Array
        (
            [0] => test"]problematyczne[/code-one] [code-one word="hehe
        )

    [2] => Array
        (
            [0] => zadanie
        )

)


które mi parsuje tekst. powinien mi wyciągnąć wyrażenia "problematyczne" i "zadanie" jednak coś źle działa.

Prawdziwe zastosowanie powinno być:

  1. preg_replace('/\[code-one word="(.*)"](.*)\[\/code-one]/i', '$2', $content);
- usuwać tagi i wyciągać tekst

Co może być złe?
by_ikar
Kropka w regexpie oznacza "wszystko" a asteriks (gwiazdka) oznacza zero lub więcej. Jest to tak zwane wyrażenie regularne zachłanne, które łapie więcej niż byśmy chcieli. Jak rozwiązać twój problem? Zachłanne wyrażenia można albo zmniejszyć im zakres wyszukiwania, poprzez dodanie znaku zapytania, albo zbudować bardziej logiczne wyrażenie.

Twój przykład: http://www.regexr.com/39jj0
przykład z ograniczonym wyrażeniem: http://www.regexr.com/39jj3
przykład z bardziej logicznym wyrażeniem: http://www.regexr.com/39jj6

polecam testować swoje wyrażenia na stronach typu regexer.com które ci dodatkowo podpowiedzą, dlaczego twoje wyrażenie działa w taki a nie inny sposób. Oczywiście trzeba mieć na uwadze że implementacja wyrażeń regularnych w php i w javascript jest nieco różna, ale w większości przypadków będziesz mógł przetestować swoje wyrażenia.
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.