preg_replace, экранирование символов и акцентированные символы./ U работает на одном сервере, но не на другом - PullRequest
1 голос
/ 17 сентября 2011

У меня есть следующий код:

 preg_replace('/[^\w-]/u','.','Bréánná MÓÚLÍN');

Который на сервере A (PHP 5.3.5) возвращает:
"Bréánná.Móúlín" (как и должно быть)

Однако на сервере B (PHP 5.2.11) возвращается:
"Br..n..M..l.n" (совсем не то, что я хочу)

Правильно ли я думаю, что все зависит от того, был ли установлен PCRE_UCP, когда все это было скомпилировано?

Есть ли способ переопределить это, если это так?

В противном случае, есть ли способ легко заменить такие символы «стандартным» эквивалентом? (Как utf8_decode, но более обширный)

1 Ответ

2 голосов
/ 17 сентября 2011

Я не уверен, влияет ли PCRE_UCP, определенное во время компиляции, на preg_replace(), но решение вашей проблемы - использование многобайтовой строковой функции mb_ereg_replace():

<?php
mb_internal_encoding("UTF-8");
mb_regex_encoding("UTF-8");

echo mb_ereg_replace('[^0-9A-Za-zÀ-ÖØ-öø-˿Ͱ-ͽͿ-῿‌-‍⁰-↏Ⰰ-⿯、-퟿豈-﷏ﷰ-�̀-ͯ‿-⁀\\-]','.','Bréánná MÓÚLÍN');

Результаты PHP 5.2: http://codepad.viper -7.com / UnZeyf

РЕДАКТИРОВАНИЕ: Первоначально я думал, что многобайтовые функции ereg поддерживают Символ UnicodeТип избегает , но оказывается, что это не так.Вместо этого вам нужно определить диапазоны символов, которые вы считаете «буквами».Я использовал диапазоны символов из определения NameChar XML Standard *1019* со следующей программой Java для генерации строки RegExp (так как очевидно, что многобайтовые функции ereg также не поддерживают escape-последовательности символов Unicode):

import java.io.*;

public class SO7456963 {
    public static void main(String[] args) throws Throwable {
        Writer w = new OutputStreamWriter(new FileOutputStream("SO7456963.txt"), "UTF-8");
        w.write("[^0-9A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u0300-\u036F\u203F-\u2040\\\\-]");
        w.close();
    }
}
...