PHP如何利用正则表达式匹配替换以下类型

想把除字母外的其他空格替换成“,”该怎么写以下规则无法替换成功
$str="李连杰 Jet Li 关之琳 Marc-André Grondin,莫妮亚·肖克里,Charlotte St-Martin BB,CC DD";
$newstr=preg_replace('/(?<!\p{L}|\p{So})\s+|\s+(?!\p{L}|\p{So})/',',',$str);
echo $newstr;
求最终替换成此效果:李连杰,Jet Li,关之琳,Marc-André Grondin,莫妮亚·肖克里,Charlotte St-Martin,CC DD

按照你的要求编写的把除字母外的其他空格替换成逗号的PHP程序如下

<?php 

 $str="李连杰 Jet Li 关之琳 Marc-André Grondin 莫妮亚·肖克里 Charlotte St-Martin BB CC DD";

 $newstr=preg_replace('/([\x{4e00}-\x{9fa5}a-z]+)\s+([\p{L}\p{So}\-]+\s+[\p{L}\p{So}\-]+)\s+/iu','$1,$2,',$str);

 $newstr=preg_replace('/([\x{4e00}-\x{9fa5}a-z]+)\s+([\p{L}\p{So}\-]+\s+[\p{L}\p{So}\-]+)$/iu','$1,$2',$newstr);

 echo $newstr;

?>

运行结果

李连杰,Jet Li,关之琳,Marc-André Grondin,莫妮亚·肖克里,Charlotte St-Martin,BB,CC DD

追问

遇到以下的相反的顺序就不能正常替换了
$str="Marc-André Grondin 莫妮亚·肖克里 Charlotte St-Martin BB CC DD 李连杰 Jet Li 关之琳 ";
变成这样:Marc-André Grondin 莫妮亚·肖克里,********,李连杰,Jet Li,关之琳
正确的应该是:Marc-André Grondin,莫妮亚·肖克里 (受到字数限制后面省略)

追答

你要正反都可以,可以用下面的PHP程序(注意是去掉了BB CC DD的程序)

<?php 

    $str="李连杰 Jet Li 关之琳 Marc-André Grondin 莫妮亚·肖克里 Charlotte St-Martin";

    $newstr=preg_replace('/(?<=[\x{4e00}-\x{9fa5}])\s+|\s+(?=[\x{4e00}-\x{9fa5}])/iu',',',$str);

    echo $newstr;

?>

运行结果

李连杰,Jet Li,关之琳,Marc-André Grondin,莫妮亚·肖克里,Charlotte St-Martin

<?php 

    $str="Marc-André Grondin 莫妮亚·肖克里 Charlotte St-Martin 李连杰 Jet Li 关之琳";

    $newstr=preg_replace('/(?<=[\x{4e00}-\x{9fa5}])\s+|\s+(?=[\x{4e00}-\x{9fa5}])/iu',',',$str);

    echo $newstr;

?>

运行结果

Marc-André Grondin,莫妮亚·肖克里,Charlotte St-Martin,李连杰,Jet Li,关之琳

追问

遇到最新问题,像这种的无法分隔“Damon Runyan Stephen Eric McIntyre Ian Matthews”正确的应该是这样“Damon Runyan,Stephen Eric McIntyre,Ian Matthews”这种该如何解决,求解谢谢!

追答

既要照顾英文中文和中文英文的格式,又要考虑全英文,而且间隔还不一样,一个正则表达式是办不到的,只能希望AI编程能解决你的问题

追问

那能不能使用多次替换来解决问题,就是先替换中英文后才再次替换没有替换成功的,这样的写法有没有,该怎么写

追答

主要是正则表达式分不清英文的姓和名,从而不知道在哪儿断开,加逗号.
所以我说只有人工智能的软件能够分清英文姓名,知道那个是两个单词的姓名,那个是三个单词的姓名

温馨提示:答案为网友推荐,仅供参考
相似回答