2016-03-20 12 views
5

Gemäß der PHP manual, der Modifikator u der regulären Ausdrücke PCRE ermöglicht UTF-8-Unterstützung für das Muster und die Betreff-Zeichenfolge.preg_split vs mb_split

In Anbetracht dessen gibt es einen Unterschied zwischen der Verwendung von PCRE-Ausdrücke mit dem u Modifizierer und den entsprechenden mb_* Multibyte-String-Funktionen? (. Unter der Annahme, dass alle Strings sind UTF-8 kodiert)


Als Beispiel betrachten preg_split vs mb_split: Beide

preg_split('/' . $pattern . '/u', $string); 

und

mb_split($pattern, $string); 

scheinen identische Ergebnisse zurückzukehren. Also, welches sollte man bevorzugen? Ist es überhaupt wichtig?

+1

Ich würde sagen, das ist ziemlich genau das gleiche wie 'preg_match' und' strpos' für eine statische String-Suche zu vergleichen. –

+1

Warum? 'strpos' unterstützt keine regulären Ausdrücke, oder irre ich mich damit? – emkey08

+1

"** für eine statische String-Suche **" - wenn die Zeichenfolge konstant ist, keine Regex ... –

Antwort

5

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.

2

Solange Sie ausschließlich mit UTF-8 arbeiten, werden Sie mit beiden in Ordnung sein. Wenn Sie einen anderen charset verwenden, dann wird empfohlen, mb_split() zu verwenden, da der Modifikator u mit PCRE Ihnen nicht erlaubt, charset anzugeben, sondern die Strings als UTF-8 behandelt.

In Bezug auf die Skalierung und langfristige Rentabilität würde ich empfehlen, mb_split() von Anfang an zu verwenden, so dass Sie abgedeckt sind, falls etwas anderes als UTF-8 verwendet wird oder unten auf der Straße benötigt wird.

+0

Sie meinen 'mb_split' statt' preg_split', nicht wahr? Sie können die Kodierung mit 'mb_regex_encoding' und dann mit den' mb_ * 'Funktionen einstellen. – emkey08

+0

Korrigieren; Tippfehler.Fest; Entschuldigung und danke. –

Verwandte Themen