Я нашел это регулярное выражение в сценарии, который я настраиваю. Может ли кто-нибудь сказать мне, что он делает?
function test( $text) { $regex = '/( [\x00-\x7F] | [\xC0-\xDF][\x80-\xBF] | [\xE0-\xEF][\x80-\xBF]{2} | [\xF0-\xF7][\x80-\xBF]{3} ) | ./x'; return preg_replace($regex, '$1', $text); }
Внутри группы захвата есть четыре варианта:
[\x00-\x7F] [\xC0-\xDF][\x80-\xBF] [\xE0-\xEF][\x80-\xBF]{2} [\xF0-\xF7][\x80-\xBF]{3} Если ни один из этих шаблонов не сопоставляется в данном месте, то любой символ будет соответствовать . который находится за пределами группы захвата.
preg_replace будет перебирать более $text находя все совпадающие совпадения, заменяя каждое соответствие тем, что было захвачено.
Здесь есть две возможности: либо весь матч находился внутри группы захвата, так что замена не меняет $text , или . в конце соответствует один символ и этот символ удаляется из $text .
Вот несколько основных примеров:
\xF8-\xFF появляется символ в диапазоне \xF8-\xFF , он всегда будет удален \xC0-\xDF в \xC0-\xDF будет удален, если не следовать символу в \x80-\xBF \xE0-\xEF в \xE0-\xEF будет удален, за исключением двух символов в \x80-\xBF \xF0-\xF7 в \xF0-\xF7 будет удален, за исключением трех символов в \x80-\xBF \x80-\xBF в \x80-\xBF будет удален, если только он не был согласован как часть одного из вышеуказанных случаев Цель состоит в том, чтобы «очистить» кодированный текст UTF-8. Часть в группе захвата,
( [\x00-\x7F] | [\xC0-\xDF][\x80-\xBF] | [\xE0-\xEF][\x80-\xBF]{2} | [\xF0-\xF7][\x80-\xBF]{3} )
… примерно соответствует действительной последовательности байтов UTF-8, длина которой может составлять от одного до четырех байтов. Значение первого байта определяет, как долго будет выполняться определенная последовательность байтов.
Поскольку замена просто, '$1' , действительные последовательности байтов будут вставлены обратно в выход. Любой байт, который не соответствует этой части, вместо этого будет сопоставляться точкой ( . ) И эффективно удаляется.
Самое важное, что нужно знать об этой технике, это то, что вам никогда не придется ее использовать. Если вы обнаружили недопустимые последовательности байтов UTF-8 в кодированном тексте UTF-8, это означает одну из двух вещей: это не совсем UTF-8, или она была повреждена. Вместо того, чтобы «очистить» его, вы должны выяснить, как он стал грязным и решить эту проблему.