PHP中的单词边界

时间:2013-03-25 12:20:06

标签: php regex preg-match word-boundary

在PHP diacritics之前和之后字母生成单词边界(\b),这不是所希望的行为。其他编程语言是否正常? (我知道大多数语言都有\b\w的问题)我应该如何有效地解决这个问题?

从Unicode角度来看哪个Unicode类别会产生单词边界?

这是一个例子:

<?php
 preg_match_all('#\bج\b#u','مَجْل',$t); // the font of this site does not display diacritics
var_dump($t);

2 个答案:

答案 0 :(得分:1)

在PCRE中:

  

\ d \ p {Nd}匹配的任何字符(十进制数字)

     

\ s \ p {Z}匹配的任何字符,加上HT,LF,FF,CR

     

\ w \ p {L}或\ p {N}匹配的任何字符,加上下划线

根据\w定义,您可以在Unicode模式下推断\b定义。因此,即使对于字符串Åström(分解的字符),逻辑具有两个字边界,也会检测到多个字边界*A*̊*stro*̈*m*

答案 1 :(得分:0)

这只是一种解决方法:

preg_match_all('#(\p{M}*\p{Arabic}*\p{M}*)*ج(\p{M}*\p{Arabic}*\p{M}*)*#u','مَجْل جميل testجواد',$t); // the font of this site does not display diacritics
print_r(array_filter(array_map('array_filter', $t)));

输出:

Array
(
    [0] => Array
        (
            [0] => مَجْل
            [1] => جميل
            [2] => جواد
        )

)

我发现\p{M}将匹配 teshkil ,而\p{Arabic}将匹配阿拉伯字母