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_replace目前正在使用我有这个正则表达式

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

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

谢谢。

4

4 回答 4

3

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

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

要了解有关锚点的更多信息,请查看此正则表达式教程

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

于 2013-06-20T19:30:33.580 回答
1

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

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

唯一的捕获组包含您要查找的字符串。见这里

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

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

preg_match('/(?:(?:www.|http::?\/\/)?example\.com\/)+(.*)/', $html, $matches);
$url = $matches[1];
于 2013-06-20T19:34:00.507 回答
0

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

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

'~(?: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/"
于 2013-06-20T19:40:24.260 回答
-1

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

preg_replace('/(http:\/\/){0,1}(www.){0,1}example.com(\/)*/i', $replacement, $subject, 1);
于 2013-06-20T19:30:53.673 回答