如果丢失,请添加网站网址

时间:2017-03-22 08:32:38

标签: php regex preg-replace

首先与我在一年前提出的question相关,现在我需要使用新的https网站更改代码位。

基本上我需要添加网站网址,如果我在上一个问题中描述的那样丢失了。

例如:/blog/images/image.png需要更改http://www.example.com/blog/images/image.png

@anonymous给出了答案,如下,

$html = preg_replace('@(http://www.example.com)?/blog@iU', 'http://www.example.com/blog', $html);

但现在问题是我还有https个链接,所以当我有https个链接时,就会在上面的代码之间添加http://www.example.com/blog

例如:https://www.example.com/blog/images/image.png转换为https://www.example.com/http://www.example.com/blog/images/image.png

现在基本上我需要在https://www.example.com之前检查http://www.example.com/blog,如果不可用,只需在http://www.example.com前添加/blog 。希望我对这个问题很清楚。

我该怎么做?

抱怨我的正则表达式知识。

2 个答案:

答案 0 :(得分:2)

添加可选的s并转义模式中的点,然后使用preg_replace_callback检查组1是否匹配。如果是,请取$1值,否则,硬编码替换:

$html = preg_replace_callback('@(https?://www\.example\.com)?/blog@i', function($m) { 
    return empty($m[1]) ? 'http://www.example.com/blog' : $m[1] . "/blog";
}, $html);

请参阅PHP demo

请注意,此处不需要U修饰符。在/blog之后,您可以添加(?=/|$)以确保blog仅在路径的整个子部分匹配时才能匹配(以避免匹配/blogs或{{1 }})。

答案 1 :(得分:1)

将其替换为不在protocol-host部分之前的任何/blog子字符串:

$html = preg_replace('@(?<!https://www\.example\.com)(?<!http://www\.example\.com)/blog@iU', 'http://www.example.com/blog', $html);

正则表达式本身是:

(?<!https://www\.example\.com)(?<!http://www\.example\.com)/blog

它使用否定前瞻检查http://www.example.comhttps://www.example.com前缀。请注意,我们必须使用两个单独的前瞻,因为前缀具有不同的长度。

演示:https://regex101.com/r/0ERgu7/1