这个正则表达式在做什么?

时间:2011-08-17 16:31:12

标签: php regex

我在我自定义的脚本中找到了这个正则表达式。有人能告诉我它在做什么吗?

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

2 个答案:

答案 0 :(得分:2)

捕获组内部有四个选项:

  1. [\x00-\x7F]
  2. [\xC0-\xDF][\x80-\xBF]
  3. [\xE0-\xEF][\x80-\xBF]{2}
  4. [\xF0-\xF7][\x80-\xBF]{3}
  5. 如果在给定位置没有匹配这些模式,那么任何字符都将与捕获组之外的.匹配。

    preg_replace调用将迭代$text查找所有非重叠匹配,将每个匹配替换为已捕获的内容。

    这里有两种可能性,要么整个匹配都在捕获组内,所以替换不会更改$text,或者最后的.匹配单个字符并删除该字符来自$text

    以下是一些基本示例:

    • 如果文本中出现\xF8-\xFF范围内的字符,则会始终将其删除
    • \xC0-\xDF中的字符将被删除,除非后跟\x80-\xBF
    • 中的字符
    • \xE0-\xEF中的字符将被删除,除非后跟\x80-\xBF
    • 中的两个字符
    • \xF0-\xF7中的字符将被删除,除非后跟\x80-\xBF
    • 中的三个字符
    • \x80-\xBF中的字符将被删除,除非它与上述案例之一相匹配

答案 1 :(得分:1)

目的似乎是“清理”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,或者它已被破坏。不应该“清理”它,而应该找出它是如何变脏并修复那个问题。