仅在开始时替换所有匹配的字符串

时间:2013-06-20 19:24:10

标签: php regex preg-replace

我想在字符串的开头替换所有匹配的匹配项。 这是一个用例。 www.example.com/example.com/http://example.com/www.abc.com/www.example.com/xyz.com/example.com 应该成为 www.abc.com/www.example.com/xyz.com/example.com

应删除每个匹配的匹配项,直到遇到非匹配的字符串。

我正在使用preg_replace目前我有这个正则表达式

'/(http:\/\/){0,1}(www.){0,1}example.com(\/)*/i' 问题是它取代了所有匹配的字符串。

我想只在开始时替换匹配的字符串,如果匹配失败一次,那么它不应该替换任何东西。 有什么帮助建议吗?

感谢。

4 个答案:

答案 0 :(得分:3)

使用^锚点确保它仅匹配字符串的开头:

'/^(http:\/\/){0,1}(www.){0,1}example.com(\/)*/i'

要了解有关锚点的更多信息,请查看this regex tutorial

注意:在正则表达式中,?{0,1}相同。

答案 1 :(得分:1)

你也可以捕获字符串而不是preg_replace:

(?:(?:www.|http::?\/\/)?example\.com\/)+(.*)

唯一的捕获组包含您正在寻找的字符串。请参阅here

另外,我注意到你的输入字符串中有http::。我在正则表达式中将它与相同的匹配但是以?为例以防万一。最后,{0,1}可能写成?。它更短:))

PHP代码(我对语言不太熟悉,但我相信这应该有用):

preg_match('/(?:(?:www.|http::?\/\/)?example\.com\/)+(.*)/', $html, $matches);
$url = $matches[1];

答案 2 :(得分:0)

首先,PHP正则表达式引擎允许您使用备用正则表达式分隔符。因此,您可以使用~#来取消转义正斜杠。此点也需要转义,因为它是一个特殊的正则表达式字符。

重构的正则表达式可以是这样的:

'~(?:https?://)?(?:www\.)?example\.com/~i'

完整的PHP代码:

$regex_replace = '~(?:https?://)?(?:www\.)?example\.com/(?!$)~i';
$string = "www.example.com/example.com/http://example.com/www.abc.com/xyz.com/example.com/";
$after = preg_replace($regex_replace, '', $string);
var_dump($after);

<强>输出:

string(32) "www.abc.com/xyz.com/example.com/"

答案 3 :(得分:-1)

使用$limit preg_replace 参数(本例中的第三个参数):

preg_replace('/(http:\/\/){0,1}(www.){0,1}example.com(\/)*/i', $replacement, $subject, 1);