简而言之,我正在利用pre_replace
查找样式表,并在本质上为我的网站上的浏览者代理这种体验,我使用外部域并将其prepend
到当前的href
。样式表的开头是这样的。
<link rel="stylesheet" type="text/css" href="/assets/css/base.css">
我将获取href
并将域名prepend
为
<link rel="stylesheet" type="text/css" href="http://www.website.com/assets/css/base.css">
我的问题是,当我遇到一个不包含HTTP/HTTPS的站点时
<link rel="stylesheet" type="text/css" href="//cdn.website.com/assets/css/base.css">
则我当前的preg替换将不起作用,并将样式表返回到以下内容
<link rel="stylesheet" type="text/css" href="http://www.website.com//cdn.website.com/assets/css/base.css">
有没有可能用preg_replace
创建某种类型的If then
,而不操作"//“href,而只替换没有绝对基域的href?
正在使用的当前preg_replace
:
$html = file_get_contents($website_url);
$domain = 'website.com';
$html = preg_replace("/(href|src)\=\"([^(http)])(\/)?/", "$1=\"$domain$2", $html);
echo $html;
发布于 2014-06-14 08:32:37
正则表达式中有if/then/else
条件,尽管这并不是工作所必需的:
(?!(href|src)=)(\")\/(\\w+.+)(\">)
代码:
$html = file_get_contents($website_url);
$domain = 'http://website.com';
$result = preg_replace("/(?!(href|src)=)(\")\/(\\w+.+)(\">)/u", "$2$domain/$3$4", $html);
echo $result;
输出:
<link rel="stylesheet" type="text/css" href="http://website.com/assets/css/base.css">
示例:
发布于 2014-06-14 07:03:21
[^(href)]
不是否定。它仍然是一个字符类。
您正在寻找(?!...)
negative lookahead
~ (href|src) =\" (?!href:) \/? ~x
虽然我质疑为每个琐事触发DOM遍历的模因和过度泛化,但应该注意的是,regex通常只适用于标准化的和众所周知的HTML输入;如果您的任务是代理任意网站,则不适用。
发布于 2018-07-28 04:57:35
function alterLinks($html) {
$ret = '';
$dom = new DomDocument();
$dom->loadHTML($html);
$links = $dom->getElementsByTagName('a');
foreach ($links as $alink) {
$href = $alink->getAttribute('href');
$aMungedLink = $this->mungeHref($href);
$alink->setAttribute("href",$aMungedLink);
}
$ret = $dom->saveHTML();
return $ret;
}
https://stackoverflow.com/questions/24214464
复制相似问题