ereg()
w PHP nie powinien być używany i został dawno temu zastąpiony przez rozszerzenie PCRE (preg_match()
).
Powody dla których należy trzymać się preg_*
są wymienione w tej wielkiej ramce na początku manualu, czyli:
- Obsługuje dużo więcej wzorców, w tym bardzo przydatne “niezachłanne” dopasowywanie:
ala.*kota
w ereg złapie cały ciąg: “ala ma kota i jaś ma kota” i nic na to nie poradzisz. W preg można złapać samo “ala ma kota” za pomocą/ala.*?kota/
(te slashe to taki poperlowy spadek, patrz niżej). - Obsługuje asercje i warunkowe wzorce.
/ala ma (?!kota)/
pasuje do “ala ma psa”, “ala ma kuku na muniu”, ale nie “ala ma kota”. - Bezpiecznie działa z danymi binarnymi, podczas gdy
ereg()
może ucinać stringi. - Obsługuje UTF-8 i np.
/\pL\pM*/u
łapie litery wraz z ich modyfikatorami. To mogą być nawet kilkunastobajtowe kombinacje liter i modyfikatorów, które tworzą wizualnie jeden znak. - Jest dużo szybsze (to ma znaczenie jeśli robisz parser). Jest nawet specjalny przełącznik
S
włączający optymalizację podczas kompilacji wzorców. - Jest ciągle rozwijane i wspierane, natomiast
ereg()
uznano za niewypał. Został całkowicie usunięty w PHP6. W PHP5 jest jeszcze trzymany tylko z litości nad starymi skryptami. - Składnia jest mniejwięcej kompatybilna z JavaScript i oczywiście Perl.
BTW: ereg("prosty tekst")
nigdy nie miało prawa bytu i w preg
też nie ma. Patrz strpos()
i strstr()
.
Tipsy dla przesiadkowiczów
W preg
wyrażenie musi być otoczone parą takich samych znaków. Tradycyjnie używa się /
(slash), ale przez to wyrażenia zawierające ścieżki albo zamykające tagi HTML muszą mieć dodatkowy backslash przed slashem w treści (\/
), dlatego można wyrażenie otaczać innym znakiem, np. wykrzyknikiem.
Na samym końcu, za znakiem otaczającym wyrażenie, umieszcza się flagi/przegłączniki, które między innymi pozwalają dopasowywać niezależnie od wielkości liter (zastępując eregi
):
preg_match('!DoWolNaWielKosC, Niom\!!i');