我在我自定义的脚本中找到了这个正则表达式。有人能告诉我它在做什么吗?
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);
}
答案 0 :(得分:2)
捕获组内部有四个选项:
[\x00-\x7F]
[\xC0-\xDF][\x80-\xBF]
[\xE0-\xEF][\x80-\xBF]{2}
[\xF0-\xF7][\x80-\xBF]{3}
如果在给定位置没有匹配这些模式,那么任何字符都将与捕获组之外的.
匹配。
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,或者它已被破坏。不应该“清理”它,而应该找出它是如何变脏并修复那个问题。