Ich habe preg_match_all('/[aäeëioöuáéíóú]/u', $in, $out, PREG_OFFSET_CAPTURE);
Wenn $in = 'hëllo'
$out
ist:
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)
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: Ссылка
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):
gibt:
%Vor%Sie können die binären Positionen auch in Code-Einheiten-Positionen umwandeln. Für UTF-8 ist eine suboptimale Implementierung:
%Vor%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.
Eine weitere Möglichkeit, UTF-8 $string
durch einen regulären Ausdruck zu teilen, ist die Funktion preg_split()
Hier ist meine Arbeitslösung:
PHP 5.3.17