我已经有代码可以替换链接,例如
$pattern = "/href=['\"]{0,1}(\/|http:\/\/)/";
$replacement = "href=http://example.com/index.php?go=\\1";
$string = preg_replace($pattern, $replacement, $html);
这适用于任何包含" http "的链接但现在我需要替换缺少" http "的链接。有不同的替代品,例如......
href="/images/some.gif"
需要改为......
href="http://example.com/images/some.gif"
有时链接可能就像
href="images/some.gif" without the / or even without the ".
答案 0 :(得分:1)
希望您正在尝试匹配
href="http://example.com/images/some.gif"
href="images/some.gif"
并替换为
href="http://example.com/index.php?go=http://example.com/images/some.gif"
href="http://example.com/index.php?go=images/some.gif"
尝试此模式并替换:
$pattern = '(href=["\']){1}(http:\/\/)?([a-z0-9_\-.\/]*)("|\'){1}';
$replacement = 'href="http://example.com/index.php?go=$2$3"';
根据您的评论,如果您要匹配无引号的HTML属性值,请将?
附加到["\']
,使其["\']?
并将("|\'){1}
更改为{{1} }}。它不是标准的HTML,但不推荐使用它。
("|\')?
答案 1 :(得分:0)
您可以使用:
$html = preg_replace('~((?:src|href)=["\']?)(?!http://)/?~', '$1http://', $html);
但是,您应该考虑使用DOM
来可靠地操纵HTML。
答案 2 :(得分:0)
使用preg_replace_callback
应该解决它
像这样的东西 -
$html_list = Array(
'href="images/some.gif"',
'href="/images/some.gif"',
'href="http://example.com/images/some.gif"',
'href=some.gif'
);
$pattern = "/((?:href)=['\"]{0,1})(?:(\/)|([a-zA-Z])|(http:\/\/))/";
$replacement = "href=http://example.com/index.php?go=\\1";
foreach($html_list as $html){
$string = preg_replace_callback($pattern,
function($m){
//print_r($m);
$r = $m[1];
if(!empty($m[2])){
return $r.'http://example.com/';
}if(isset($m[3]) && !empty($m[3])){
return $r.'http://example.com/'.$m[3];
}
//This matches http part
return $r.'http://example.com/index.php?go=';
}
, $html);
print_r($string."\n");
}
输出 -
href="http://example.com/images/some.gif"
href="http://example.com/images/some.gif"
href="http://example.com/http://example.com/images/some.gif"
href=http://example.com/some.gif