簡體   English   中英

PHP preg_replace HREF

[英]PHP preg_replace HREF

總之,我使用pre_replace找到樣式表,基本上代理這方面的經驗對我的網站的觀眾,我用的是外部域,並prepend它目前的href 樣式表就是這樣開始的。

<link rel="stylesheet" type="text/css" href="/assets/css/base.css">

我將采用hrefprepend域名

<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">

例:

http://regex101.com/r/kU7pF1

[^(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM