2010-02-10 13 views
14

Jestem pewien, że to jest trywialne, ale nie jestem w stanie stworzyć wyrażeń regularnych, które uwzględniają, że temat składa się z wielu linii. Wydaje się, że modyfikator "m" dla jednego nie działa.php preg_replace regex pasujące do wielu linii

+0

Czy jesteś pozytywny, że wyrażenie regularne jest poprawne? – Romain

+0

Użyj msU , aby przeczytać szczegóły, przeczytaj poniższy link http://zendf.wordpress.com/2012/02/08/php-preg_match-multi-line-match/ – Tofeeq

Odpowiedz

7

Czy próbowałeś modyfikatora 's'? Znaczenie "traktuj jak pojedynczą linię. "m" umożliwia użycie początków i końcówek linii^i $.

+0

Ah IC, spróbuje tego jutsu. Jeszcze jedno pytanie: jak dopasować nowe linie, spacje lub tabulatory? Jak dotąd wymyśliłem "[\\ n \\ t] *", zgadza się? –

+0

Wystarczy użyć '\ s', co oznacza dowolny znak spacji. –

+0

\ s dopasowuje "białą przestrzeń" (co oznacza \ ti przestrzeń) i wierzę, że może zawierać \ n również w przypadku użycia z "s". – ziya

45

Maxwell Troy Milton King ma rację, ale ponieważ jego odpowiedź jest trochę krótka, opublikuję to również i przedstawię kilka przykładów do zilustrowania.

Po pierwsze, meta znak . domyślnie NIE pasuje do podziałów linii. Dotyczy to wielu implementacji regex, w tym smaku PHP. Powiedział, że ma tekst:

$text = "Line 1\nLine 2\nLine 3"; 

i regex

'/.*/' 

następnie wyrażenie regularne będzie tylko dopasować Line 1. Przekonaj się sam:

preg_match('/.*/', $text, $match); 
echo $match[0]; // echos: 'Line 1' 

od .* "przestanie dopasowanie" w nowym składzie \n (char). Jeśli chcesz, aby to dopasować podziały wiersza, jak również, dołącz S-modyfikator (aka DOT-ALL modyfikujący) na końcu swojej regex:

preg_match('/.*/s', $text, $match); 
echo $match[0]; // echos: 'Line 1\nLine 2\nLine 3' 

Teraz o m-modyfikatora (multi-line): to pozwoli ^ dopasować nie tylko początek ciąg wejściowy, ale także początek każdej linii. To samo z $: pozwoli $ dopasować nie tylko koniec łańcucha wejściowego, ale także koniec każdej linii.

Przykład:

$text = "Line 1\nLine 2\nLine 3"; 
preg_match_all('/[0-9]$/', $text, $matches); 
print_r($matches); 

który pasuje tylko 3 (przy końcu wejścia). Ale:

ale umożliwiając M modyfikator:

$text = "Line 1\nLine 2\nLine 3"; 
preg_match_all('/[0-9]$/m', $text, $matches); 
print_r($matches); 

wszystkie (pojedyncze) cyfr na końcu każdej linii ('1', '2' i '3') są dopasowane.

+3

+1 fantastyczna odpowiedź – blak3r

Powiązane problemy