twh*_*mon 5 php regex encoding
$str = '?? ?? ????? ?? ???? ??? ??? ???';
$str = preg_replace('/(?<=\b)?????(?=\b)/u', 'Musa', $str);
$str = preg_replace('/(?<=\b)???(?=\b)/u', 'suna', $str);
echo $str;
Run Code Online (Sandbox Code Playgroud)
这无法取代?????.它应该给予?? ?? Musa ?? ???? ??? suna ???,而是给予?? ?? ????? ?? ???? ??? suna ???.
这是发生了与结尾的所有单词?,像??????.它适用于单词?中间的单词(没有单词以a开头?).这是否意味着\b不适用??这是一个错误吗?
原因是单词边界在以下位置匹配:
\n\n\n\n\n\n
\n- 如果第一个字符是单词字符,则在字符串中的第一个字符之前。
\n- 在字符串中的最后一个字符之后,如果最后一个字符是单词字符。
\n- 字符串中的两个字符之间,其中一个是单词字符,另一个不是单词字符。
\n
“有问题的”符号属于U+0670 ARABIC LETTER SUPERSCRIPT ALEF(\\p{Mn}非空格标记 Unicode 类别),因此是一个非单词符号。 \\b如果前面有属于\\w(字母、数字、_)的字符,则将匹配。
仅当搜索短语前面/后面没有单词字符时,才使用明确的边界:
\n\n$str = \'\xda\xa9\xd8\xb3 \xd9\x86\xdb\x92 \xd9\x85\xd9\x88\xd8\xb3\xdb\x8c\xd9\xb0 \xda\xa9\xdb\x92 \xd8\xa8\xd8\xa7\xd8\xb1\xdb\x92 \xd9\x85\xdb\x8c\xda\xba \xd8\xb3\xd9\x86\xd8\xa7 \xdb\x81\xdb\x92\xd8\x9f\';\n$str = preg_replace(\'/(?<!\\w)\xd9\x85\xd9\x88\xd8\xb3\xdb\x8c\xd9\xb0(?!\\w)/u\', \'Musa\', $str);\n$str = preg_replace(\'/(?<!\\w)\xd8\xb3\xd9\x86\xd8\xa7(?!\\w)/u\', \'suna\', $str);\necho $str; // => \xda\xa9\xd8\xb3 \xd9\x86\xdb\x92 Musa \xda\xa9\xdb\x92 \xd8\xa8\xd8\xa7\xd8\xb1\xdb\x92 \xd9\x85\xdb\x8c\xda\xba suna \xdb\x81\xdb\x92\xd8\x9f\nRun Code Online (Sandbox Code Playgroud)\n\n请参阅PHP 演示。
\n\n这(?<!\\w)是一个负向后查找,确保紧接着后续消费模式之前没有单词字符,并且(?!\\w)是一个消极向前查找,确保紧接着前面的消费模式之后没有单词字符。
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |