Der Hauptunterschied besteht darin, dass die Funktionen preg_
pcre library verwenden, wenn die mb_ereg_
Funktionen (einschließlich mb_split
) Verwenden des oniguruma library (verwendet in rubin vor der Version 2.0).
Der Hauptgrund ist, dass Oniguruma mit mehreren Kodierungen umgehen kann (ASCII, UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE, EUC-JP, EUC-TW, EUC-KR , EUC-CN, Shift_JIS, Big5, GB18030, KOI8-R, CP1251, ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5, ISO-8859 -6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10, ISO-8859-11, ISO-8859-13, ISO-8859-14, ISO-8859-15 , ISO-8859-16) wenn pcre nicht kann.
Beachten Sie, dass viele Kodierungen für mb_
Funktionen wie mb_detect_encoding
sind nicht in dieser Liste (UTF-7, Armenian Standard Code for Information Interchange-8, CP866 zum Beispiel) zu begrenzen, die Relevanz von mb_ereg_
Funktionen. (Da müssen Sie die Zeichenfolge in eine unterstützte Codierung konvertieren, bevor Sie daran arbeiten, und danach wieder zu konvertieren.)
Die beiden Regex-Engines teilen mehr oder weniger die gleichen Funktionen, dennoch können Sie einige Unterschiede finden (keinen Anspruch auf Vollständigkeit, wie es kommt):
Oniguruma nicht unterstützt:
- einen Buchstaben Unicode Stenografie Zeichenklassen ohne geschweifte Klammern geschrieben werden.
Beispiel: \pN
als pN
zu sehen ist, müssen Sie schreiben: \p{N}
- die Unicode-Zeichenklassen: Xan, XPS-, XSP, Xwd
- nicht entgangen eckige Klammern in einer Zeichenklasse: Oniguruma
[][]
als zwei leere Zeichen sehen Klassen, wenn pcre eine Zeichenklasse sehen, die ]
und [
- die
\K
Funktion
- der
\R
alias für newline benannten Gruppen Sequenzen
- enthält, der die Python-Syntax
(?P<name>...)
. Nur (?<name>...)
oder (?'name'...)
sind erlaubt.
- Gruppenreferenzen mit etwas anderem als der Oniguruma-Syntax:
\g<name>
(Perl-Syntax (?&name)
und (?1)
oder (?R)
sind nicht zulässig).
- Rückzieher Steuer Verben
PCRE nicht unterstützt:
- dupliziert genannten Gruppen (Standard). Sie müssen den Modifikator
(?J)
verwenden, um diese Funktion zu aktivieren.
- nummerierte Rückverweise mit
\k<...>
Syntax. Sie können \k<name>
aber nicht \k<1>
oder \k<-1>
schreiben.
- Rückverweise auf eine bestimmte Verschachtelungsebene. Oniguruma kann dies unter Verwendung von
\k<name+n>
tun, wobei n
die Verschachtelungsebene ist.
Um neue Zeilen mit dem Punkt, Oniguruma verwendet den m
Modifikator übereinstimmen, wenn PCRE die s
Modifikator verwendet. In mb_ereg_
Funktionen entspricht der Punkt standardmäßig Newlines. (Der Modifikator m
ist standardmäßig aktiviert).
PCRE verwendet den Modifikator s
, um Newline mit dem Punkt zu vergleichen. Der Modifikator m verhält sich bei PCRE anders, er ändert die Bedeutung von ^
und $
Anker von "Start" und "Ende" der Zeichenfolge zu "Start" und "Ende" der Zeile.
Mit Oniguruma ändert sich die Bedeutung dieser Anker nicht, sie passen immer den Anfang und das Ende der Linie an. Um die Grenze der Zeichenfolge zu erreichen, werden \A
und \z
verwendet, die auch mit PCRE verfügbar sind.
Beachten Sie, dass Oniguruma gegabelt wurde, um Onigmo (in aktuellen Ruby-Versionen verwendet) zu geben, das mehr Perl-Funktionen und syntaktische Elemente implementiert, und das ist PCRE ähnlicher.
Ich würde sagen, das ist ziemlich genau das gleiche wie 'preg_match' und' strpos' für eine statische String-Suche zu vergleichen. –
Warum? 'strpos' unterstützt keine regulären Ausdrücke, oder irre ich mich damit? – emkey08
"** für eine statische String-Suche **" - wenn die Zeichenfolge konstant ist, keine Regex ... –