PHP preg_replace HREF

时间:2014-06-13 22:12:06

标签: php regex preg-replace

简而言之,我利用pre_replace查找样式表,并基本上为我网站上的观众代理这种体验,我使用外部域prepend将其用于当前{{1 }}。样式表就是这样开始的。

href

我会将<link rel="stylesheet" type="text/css" href="/assets/css/base.css"> href域名视为

prepend

我的问题是,当我遇到不包含HTTP / HTTPS

的网站时
<link rel="stylesheet" type="text/css" href="http://www.website.com/assets/css/base.css">

然后我当前的preg替换将无法运行并将样式表返回到以下

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

是否可以使用<link rel="stylesheet" type="text/css" href="http://www.website.com//cdn.website.com/assets/css/base.css"> 创建某种If then来操纵&#34; //&#34; hrefs只替换没有绝对基域的那些?

正在使用的当前preg_replace

preg_replace

2 个答案:

答案 0 :(得分:1)

[^(href)]不是否定。它仍然是一个角色类。

您正在寻找(?!...) negative lookahead

 ~  (href|src) =\" (?!href:)  \/?  ~x

虽然我对SO模因和为每个琐事启动DOM遍历的过度概括提出质疑,但应该注意的是,正则表达式通常仅适用于规范化和众所周知的HTML输入;如果你的任务是代理任意网站,那就不行了。

答案 1 :(得分:0)

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;
}