[英]PHP preg_replace HREF
總之,我使用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">
是否有可能創建某種類型的If then
使用preg_replace
來不操作“//”href並且只替換沒有絕對基域的那些?
當前使用的preg_replace
:
$html = file_get_contents($website_url);
$domain = 'website.com';
$html = preg_replace("/(href|src)\=\"([^(http)])(\/)?/", "$1=\"$domain$2", $html);
echo $html;
正則表達式中有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">
例:
[^(href)]
不是否定。 它仍然是一個角色類。
您正在尋找(?!...)
否定前瞻 :
~ (href|src) =\" (?!href:) \/? ~x
雖然我對SO模因和為每個瑣事啟動DOM遍歷的過度概括提出質疑,但應該注意的是,正則表達式通常僅適用於規范化和眾所周知的HTML輸入; 如果您的任務代理任意網站,請不要這樣做。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.