Ponieważ wyrażenia regularne POSIX (ereg) są przestarzałe od PHP 5.3.0, chciałbym poznać łatwy sposób konwersji starych wyrażeń na PCRE (wyrażenia regularne kompatybilne z Perlem) (preg) .
Na przykład mam to wyrażenie regularne:
eregi('^hello world');
Jak mogę przetłumaczyć wyrażenia na preg_match
zgodne wyrażenia?
Uwaga: ten post służy jako miejsce zastępcze dla wszystkich postów związanych z konwersją z ereg na preg oraz jako duplikat opcji dla powiązanych pytań. Nie zamykaj tego pytania.
Związane z:
php
preg-replace
preg-match
pcre
ereg
netcoder
źródło
źródło
ereg [php]
nie daje zbyt użytecznych wyników. OK, mogę udzielić mi wsparcia dla tego.Odpowiedzi:
Największą zmianą w składni jest dodanie ograniczników .
Separatorami może być prawie wszystko, co nie jest alfanumeryczne, odwrotnym ukośnikiem lub białym znakiem. Najbardziej powszechnie stosowane są
~
,/
i#
.Możesz również użyć pasujących nawiasów:
Jeśli separator znajduje się w wyrażeniu regularnym, musisz go zmienić:
Możesz łatwo zmienić znaczenie wszystkich separatorów i znaków zastrzeżonych w ciągu, używając preg_quote :
Ponadto PCRE obsługuje modyfikatory do różnych rzeczy. Jednym z najczęściej używanych jest modyfikator bez rozróżniania wielkości liter
i
, alternatywa dla eregi :Pełne odniesienie do składni PCRE w PHP można znaleźć w podręczniku , a także listę różnic między wyrażeniami regularnymi POSIX i PCRE, aby pomóc w konwersji wyrażenia.
Jednak w prostym przykładzie nie użyłbyś wyrażenia regularnego:
źródło
/^\/hello/
przykład.(a(b)c)
jest doskonale poprawnym, ograniczonym PCRE. Osobiście lubię używać nawiasów,()
aby przypomnieć sobie, że pierwsze przechwycone dopasowanie to całość.error_log
s uzyskać pełny z tych ostrzeżeń:PHP Deprecated: Function ereg() is deprecated in...
. Argh!Zastąpienie Ereg preg (od PHP 5.3.0) było dobrym posunięciem na naszą korzyść.
preg_match, który używa składni wyrażeń regularnych zgodnej z Perlem, jest często szybszą alternatywą dla ereg.
Powinieneś wiedzieć 4 główne rzeczy, aby przenieść wzorce ereg na preg:
Dodaj ograniczniki (/):
'pattern' => '/pattern/'
Separator ucieczki, jeśli jest częścią wzorca:
'patt/ern' => '/patt\/ern/'
Osiągnij go programowo w następujący sposób:
$old_pattern = '<div>.+</div>';
$new_pattern = '/' . addcslashes($old_pattern, '/') . '/';
eregi (dopasowywanie bez uwzględniania wielkości liter):
'pattern' => '/pattern/i'
Tak więc, jeśli używasz funkcji eregi do dopasowywania bez uwzględniania wielkości liter, po prostu dodaj „i” na końcu nowego wzorca („/ wzorzec /”).Wartości ASCII : W ereg, jeśli używasz liczby we wzorcu, zakłada się, że odnosisz się do ASCII znaku. Ale w preg liczba nie jest traktowana jako wartość ASCII. Tak więc, jeśli twój wzorzec zawiera wartość ASCII w wyrażeniu ereg (na przykład: nowa linia, tabulatory itp.), Przekonwertuj go na szesnastkowy i poprzedz go znakiem \ x.
Example: 9(tab) becomes \x9 or alternatively use \t.
źródło
Od wersji PHP 5.3
ereg
jest przestarzałe.Przejście od
ereg
dopreg_match
to tylko niewielka zmiana w naszym schemacie.Najpierw musisz dodać ograniczniki do swojego kodu, np:
do
Aby
eregi
dopasować bez rozróżniania wielkości liter, umieśći
po ostatnim ograniczniku, np .:do
źródło
Istnieje więcej różnic między
ereg()
ipreg_replace()
niż tylko składnią:Wartość zwracana:
FALSE
ereg()
wracaFALSE
,preg_match()
wraca0
ereg()
zwraca długość ciągu lub1
,preg_match()
zwraca zawsze1
Wynikowa tablica dopasowanych podciągów: Jeśli jakiś podciąg nie zostanie w ogóle znaleziony (
(b)
w...a(b)?
), odpowiadającyereg()
wynik będzie takiFALSE
, podczas gdy wpreg_match()
nim nie zostanie w ogóle ustawiony.Jeśli ktoś nie jest na tyle odważny, aby przekonwertować swoją
ereg()
napreg_match()
to, może użyć mb_ereg () , który jest nadal dostępny w PHP 7.źródło