例如我有一个这样的字符串:
$html = '
<a href="test.html">test</a>
<a href="http://mydomain.com/test.html">test</a>
<a href="http://otherdomain.com/test.html">test</a>
<a href="someothertest/otherdir/hi.html">hi</a>
';
我希望将绝对网址附加到没有给出绝对域名的所有hrefs。
$html = '
<a href="http://mydomain.com/test.html">test</a>
<a href="http://mydomain.com/test.html">test</a>
<a href="http://otherdomain.com/test.html">test</a>
<a href="http://mydomain.com/someothertest/otherdir/hi.html">hi</a>
';
最好的办法是什么?我猜RegEx的东西,但我的RegEx技能是**;)
提前感谢!
答案 0 :(得分:9)
找到了一个好方法:
$html = preg_replace("#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#", '$1http://mydomain.com/$2$3', $html);
如果您的$ html
中还有mailto链接,则可以使用(?!http|mailto)
答案 1 :(得分:4)
$domain = 'http://mydomain';
preg_match_all('/href\="(.*?)"/im', $html, $matches);
foreach($matches[1] as $n=>$link) {
if(substr($link, 0, 4) != 'http')
$html = str_replace($matches[1][$n], $domain . $matches[1][$n], $html);
}
答案 2 :(得分:1)
上一个答案将导致您的第一个和第四个示例出现问题,因为它无法包含正斜杠以将页面与页面名称分开。不可否认,这可以通过简单地将其附加到$ domain来修复,但如果你这样做,那么href =“/ something.php”最终会有两个。
只是提供一个替代的Regex解决方案,你可以使用这样的东西......
$pattern = '#'#(?<=href=")(.+?)(?=")#'';
$output = preg_replace_callback($pattern, 'make_absolute', $input);
function make_absolute($link) {
$domain = 'http://domain.com';
if(strpos($link[1], 'http')!==0) {
if(strpos($link[1], '/')!==0) {
return $domain.'/'.$link[1];
} else {
return $domain.$link[1];
}
}
return $link[1];
}
但是值得注意的是,使用诸如href =“example.html”之类的链接,链接相对于当前目录,到目前为止所示的方法都不能正常用于不在根目录中的相对链接。为了提供解决方案,尽管需要更多关于信息来源的信息。