PHP正则表达式替换?

问题描述 投票:0回答:3

我想在字符串中用逗号分割alpha-numeric(带空格)和non-alpha-numeric

我尝试过这个...

$str = "This is !@#$%^&";
preg_replace("/([a-z0-9_\s])([^a-z0-9_])/i", "$1, $2", $str);

但是我得到了这个结果...

这个,是,!@#$%^&

如何修复搜索模式以获得此结果?

这是,!@#$%^&

谢谢。

php regex preg-replace
3个回答
3
投票

您应该为第二组否定第一组中的所有内容,如下所示:

preg_replace("/([a-z0-9_\s])([^a-z0-9_\s])/i", "$1, $2", $str);

否则,它也会因空格而分裂。


0
投票

您可能必须在多次迭代中执行此操作。试试这个:

$preg = array( "/([\w\s]+)/i", "/([\W\s]+)/i" ):
$replace = array( "\\1, ", "\\1 " );
$result = rtrim( preg_replace( $preg, $replace, $input ) ); // rtrim to get rid of any excess spaces

0
投票

字符类中字母数字字符的 posix 表达式为

[[:alnum:]]
,但也可以使用不区分大小写的模式修饰符将其写为
[a-z\d]

只需匹配一个或多个数字字符,然后使用

\K
“忘记它们”,然后向前查找后跟非数字字符的空格 (
[^[:alnum:]]
)。 这个零宽度匹配将标记应插入逗号的位置。 不需要反向引用。

代码:(演示

$text = <<<TEXT
This is !@#$%^&
TEXT;

echo preg_replace("/[[:alnum:]]+\K(?= [^[:alnum:]])/", ",", $text);
// This is, !@#$%^&
© www.soinside.com 2019 - 2024. All rights reserved.