我想在字符串的开头替换所有匹配的匹配项。
这是一个用例。
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'
问题是它取代了所有匹配的字符串。
我想只在开始时替换匹配的字符串,如果匹配失败一次,那么它不应该替换任何东西。 有什么帮助建议吗?
感谢。
答案 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);