UTF-8 Zeichen in preg_match_all (PHP)

8

Ich habe preg_match_all('/[aäeëioöuáéíóú]/u', $in, $out, PREG_OFFSET_CAPTURE);

Wenn $in = 'hëllo' $out ist:

%Vor%

Die Position von o sollte 4 sein. Ich habe online über dieses Problem gelesen (das ë wird als 2 gezählt). Gibt es dafür eine Lösung? Ich habe mb_substr und ähnliches gesehen, aber gibt es so etwas für preg_match_all ?

Art von verwandt: Ist ihr Äquivalent von preg_match_all in Python? (Rückgabe eines Arrays von Übereinstimmungen mit ihrer Position in der Zeichenfolge)

    
roflwaffle 02.02.2010, 20:53
quelle

4 Antworten

0

PHP unterstützt Unicode nicht sehr gut, daher enthalten viele String-Funktionen, einschließlich preg_ *, immer noch Byte anstelle von Zeichen.

Ich habe versucht, eine Lösung zu finden, indem ich Strings kodierte und decodierte, aber letztlich ging alles auf die Funktion preg_match_all zurück.

Über die Python-Sache: Ein Python-Regex-Matchobjekt enthält standardmäßig die passende Position, mo.start () und mo.end (). Siehe: Ссылка

    
Tor Valamo 02.02.2010, 21:14
quelle
6

Dies ist kein Fehler, PREG_OFFSET_CAPTURE bezieht sich auf den Byte-Offset des Zeichens in der Zeichenkette.

mb_ereg_search_pos verhält sich genauso. Eine Möglichkeit besteht darin, die Codierung zuvor in UTF-32 zu ändern und dann die Position durch 4 zu teilen (weil alle Unicode-Codeeinheiten als 4-Byte-Sequenzen in UTF-32 dargestellt werden):

%Vor%

gibt:

%Vor%

Sie können die binären Positionen auch in Code-Einheiten-Positionen umwandeln. Für UTF-8 ist eine suboptimale Implementierung:

%Vor%     
Artefacto 08.08.2010 00:23
quelle
2

Es gibt eine einfache Problemumgehung, die verwendet werden kann, nachdem preg_match () Ergebnisse gefunden wurden. Sie müssen jedes Übereinstimmungsergebnis iterieren und den Positionswert mit folgendem Befehl neu zuweisen:

%Vor%

Getestet auf PHP 5.4 unter Windows, hängt nur von der Multibyte-PHP-Erweiterung ab.

    
quelle
0

Eine weitere Möglichkeit, UTF-8 $string durch einen regulären Ausdruck zu teilen, ist die Funktion preg_split() Hier ist meine Arbeitslösung:

%Vor%

PHP 5.3.17

    
revoke 19.11.2014 00:06
quelle

Tags und Links