php preg_replace: модификатор unicode для строк ascii - PullRequest
1 голос
/ 02 апреля 2012

Мне нужно обрабатывать строки в моем php-скрипте с помощью регулярных выражений. Но есть проблема - разные строки имеют разные кодировки. Если строка содержит только символы ascii, функция mb_detect_encoding возвращает 'ASCII'. Но если строка содержит русские символы, например, mb_detect_encoding возвращает 'UTF-8'. Полагаю, не стоит проверять кодировку каждой строки вручную. Таким образом, вопрос - правильно ли использовать preg_replace (с модификатором unicode) для строк ascii? Правильно ли писать такой код preg_replace ("/[^_a-z]/u","",$string); для строк ascii и utf-8?

Ответы [ 3 ]

2 голосов
/ 02 апреля 2012

Это не будет проблемой, если два варианта: «UTF-8» или «ASCII», но это не так.

Если PHP не использует UTF-8, он использует ISO-8859-1, который НЕ является ASCII (это расширенный набор ASCII, в котором первые 127 символов. Это расширенный набор ASCII. Некоторые символы, например шведские å, ä и ö, могут быть представлены вИ ISO-8859-1, и Unicode, с разными кодовыми точками! Я не думаю, что это имеет большое значение для функций preg_ *, поэтому это может быть неприменимо к вашему вопросу, но имейте это в виду при работе с различными кодировками.

Вы должны действительно, действительно пытаться узнать, в каком наборе символов находятся ваши строки, без магии mb_detect_encoding (mb_detect_encoding не является гарантией, просто хорошая догадка). Например, строки, извлеченные через HTTP, имеют набор символовуказано в заголовке HTTP.

0 голосов
/ 02 апреля 2012

7-битный набор символов ASCII кодируется идентично в UTF-8. Если у вас есть строка ASCII, вы можете использовать модификатор PREG "u".

Однако, если у вас есть «дополненный» 8-битный набор символов ASCII, такой как ISO-8859-1, Windows-1252 или HP-Roman8, символы с установленным крайним левым битом (значения x80 - xff) не кодируются. то же самое в UTF-8, и было бы неправильно использовать модификатор PREG "u".

0 голосов
/ 02 апреля 2012

Да, конечно, вы всегда можете использовать модификатор Unicode, и это не повлияет ни на результаты, ни на производительность.

...