php的preg_replace在字符串中只替换一次


PHPs preg_replace replaces only once in a string

为什么preg_replace在字符串中只替换我搜索的字符串一次?

我有一个字符串"Hello------World"。

我用这个

preg_replace( '#--#', '-', 'Hello------World');

但是preg_replace返回"Hello- World"。所以它替换了第一个,继续不检查是否还有——的出现如何让"你好,世界"Hello World"?

你看到的是正确的行为。regexp匹配两个破折号,用一个破折号替换它们,然后继续搜索。再次找到两个破折号,用一个代替它们。所以六个破折号变成三个。

解决方案是匹配多个破折号,然后用一个破折号替换:

preg_replace( '#--+#', '-', 'Hello------World');

regexp中的+将匹配至少一个破折号,但尽可能多地匹配这些字符。更具体地说,它匹配所有破折号,直到字符串中出现非破折号。因此,它现在将找到所有六个破折号,用一个破折号替换它们,并继续搜索以找到更多的破折号。

我认为您需要向regexp添加一个全局标志,否则它只匹配字符串的第一次出现。像preg_replace("#,#/g","-","你好,世界");或者是