首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅当缺少协议时才使用preg_replace href或src

仅当缺少协议时才使用preg_replace href或src
EN

Stack Overflow用户
提问于 2012-02-02 08:48:30
回答 2查看 455关注 0票数 1

我一直致力于解析一个输入,即HTML。但是,我需要能够找到所有没有协议的href或src属性,例如http://,https://或ftp://等,当它们没有用包含协议和域的变量替换它时。

例如,我想要

代码语言:javascript
复制
<a href="/_mylink/goes/here">Link 1</a>
<a href="http://site.com/_myotherlink/goes/here">Link 2</a>

返回:

代码语言:javascript
复制
<a href="http://mydomain.com/_mylink/goes/here">Link 1</a>
<a href="http://site.com/_myotherlink/goes/here">Link 2</a>

我可以获得整个href属性,但我似乎不知道如何只在缺少协议的情况下进行匹配和替换。我发现^0-9可以以反/非的方式工作,但当我尝试使用http:// etc时,我发现我无法让它工作。

编辑:

我只想提一下,因为它对我来说已经是这个问题的“范围”的一部分,我想避免由于替换而导致的url编码,因为我在其中的一些上使用了{}之类的东西,我不希望它们中有%7B%7D这样的东西。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-02 09:12:25

为什么不使用DOM轻松地替换这些属性呢?例如

代码语言:javascript
复制
$domain = 'http://mydomain.com';
$currentPath = '/some/absolute/path/'; // make sure this starts and ends with a forward-slash

$doc = new DOMDocument();
$doc->loadHTML($html);

$xpath = new DOMXPath($doc);
$attrs = $xpath->query('//@href[not(contains(., "://"))]');
foreach ($attrs as $attr) {
    $attr->value = sprintf('%s%s%s',
        $domain,
        $attr->value[0] == '/' ? '' : $currentPath,
        htmlspecialchars($attr->value)
    );
}

$attrs = $xpath->query('//@src[not(contains(., "://"))]');
foreach ($attrs as $attr) {
    $attr->value = sprintf('%s%s%s',
        $domain,
        $attr->value[0] == '/' ? '' : $currentPath,
        htmlspecialchars($attr->value)
    );
}

echo $doc->saveHTML();
票数 3
EN

Stack Overflow用户

发布于 2012-02-02 09:10:04

从本质上讲,您正在寻找的是“非”-pattern。那将是一个negative assertion

代码语言:javascript
复制
 (?!http://)

例如,将其添加到/href="(?!http://)[^"]+"/中。

或者,您可以使用preg_replace_callback并对其进行排序。

既然您说过“解析”,那么它就是一种主题;对于HTML遍历,另一种选择是phpqueryquerypath。然后,您可以使用以下命令遍历所有链接:

代码语言:javascript
复制
 foreach (htmlqp($html)->find("a[href]") as $tag) {
      if (!strstr($tag->attr("href"), "http://")) {
             $tag->attr("href", "$add....");

输出转换显然是过度杀伤力。但是对于任意的HTML来说,这可能是一个更有弹性的选择。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9105637

复制
相关文章

相似问题

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