Что это за регулярное выражение?

Я нашел это регулярное выражение в сценарии, который я настраиваю. Может ли кто-нибудь сказать мне, что он делает?

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); } 

Внутри группы захвата есть четыре варианта:

  1. [\x00-\x7F]
  2. [\xC0-\xDF][\x80-\xBF]
  3. [\xE0-\xEF][\x80-\xBF]{2}
  4. [\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, или она была повреждена. Вместо того, чтобы «очистить» его, вы должны выяснить, как он стал грязным и решить эту проблему.