首先与我在一年前提出的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
。希望我对这个问题很清楚。
我该怎么做?
抱怨我的正则表达式知识。
答案 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.com
和https://www.example.com
前缀。请注意,我们必须使用两个单独的前瞻,因为前缀具有不同的长度。