preg_split('/(?<!^)(?!$)/u', $string ) 这个正则为啥能够split多字节字符

function mb_str_split( $string ) { 
    # Split at all position not after the start: ^ 
    # and not before the end: $ 
    return preg_split('/(?<!^)(?!$)/u', $string ); 
} 

$string = '火车票';
$charlist = mb_str_split( $string );

print_r( $charlist );
?>

Prints:

Array
(

[0] => 火 
[1] => 车 
[2] => 票 

)


是PHP手册里面的一个例子,其实已经有注释了。 自己知道要区分多字节正则表达式需要加上 u 修饰符, 但是对里面的正则代表的含义不是太懂,(?<!^)(?!$) 正则具体匹配到的是那些字符?

阅读 6.3k
2 个回答

是环视,匹配位置的用法~

(?<!expr)(?!expr)都是零宽断言,前者表示此位置之前不匹配expr,后者表示此位置之后不匹配expr。
在正则中^$单独用表示开头和末尾。
也就是说(?<!^)表示此位置之前不匹配开头,(?!$)表示此位置之后不匹配末尾。
所以这个split匹配到的部分,为每两个字的中间位置(但是没有匹配到任何实际的字符)。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题