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

Php 仅在开始时替换所有匹配字符串,php,regex,preg-replace,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\u replace目前我有一个正则表达式 '/(http:\/\/){0,1}(

我想替换字符串开头的所有匹配匹配项。 这里是一个用例。
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\u replace
目前我有一个正则表达式

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

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


谢谢

使用
^
锚定以确保其仅匹配字符串开头:

'/^(http:\/\/){0,1}(www.){0,1}example.com(\/)*/i'
要了解有关锚的更多信息,请查看

注意:在正则表达式中,
{0,1}

使用
preg\u replace
$limit
参数相同(本例中的第三个参数):


您还可以捕获字符串而不是preg_replace:

(?:(?:www.|http::?\/\/)?example\.com\/)+(.*)
唯一的捕获组包含您要查找的字符串。看

另外,我注意到您的输入字符串中有
http::
。我在正则表达式中将其与相同的匹配,但使用了一个
,以防万一。最后一件事,
{0,1}
可以写成
。它比较短:)

PHP代码(我对该语言不太熟悉,但我相信这应该可以实现):


首先,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/"

限制意味着只进行X次匹配,所以他仍然会有相同的错误。仅替换第一个匹配项。顺便说一下,这使用了
preg\u match
。但是你仍然可以使用
preg\u replace
并替换为
\1
@Arif我对PHP不太熟悉,但我相信这应该是可行的:
preg\u match('/(?:(?:www.http:?\/\/)?example\.com\/)+(*)/,$html,$matches)$url=$matches[1]谢谢。这对我帮助很大。http:
中的双冒号输入错误。这里我的测试代码
$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);echo$after如果将“/”放在example.com的末尾,此解决方案将失败。然后它也将替换最后一个检查此字符串“”,在本例中,它也将替换中间的字符串。您是否在问题中首先明确指定了您的要求?您不能像这样一直更改测试数据。很抱歉,你没有雇用我为你做这项工作。我的解决方案解决了你的原始问题,其他问题你应该能解决。
$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/"