首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP preg_replace HREF

PHP preg_replace HREF
EN

Stack Overflow用户
提问于 2014-06-14 06:12:06
回答 3查看 2.4K关注 0票数 1

简而言之,我正在利用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;
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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">

示例:

票数 2
EN

Stack Overflow用户

发布于 2014-06-14 07:03:21

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

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

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

虽然我质疑为每个琐事触发DOM遍历的模因和过度泛化,但应该注意的是,regex通常只适用于标准化的和众所周知的HTML输入;如果您的任务是代理任意网站,则不适用。

票数 1
EN

Stack Overflow用户

发布于 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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24214464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档