Я нашел это регулярное выражение в сценарии, который я настраиваю. Может ли кто-нибудь сказать мне, что он делает?
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, или она была повреждена. Вместо того, чтобы «очистить» его, вы должны выяснить, как он стал грязным и решить эту проблему.