繁体   English   中英

仅在缺少协议时preg_replace href或src

[英]preg_replace href or src only when protocol is missing

我正在解析输入,即HTML。 但是,我需要能够找到所有没有协议(例如http://,https://或ftp://等)的href或src属性,并且当它们不替换为包含协议和域的变量。

例如,我想要

<a href="/_mylink/goes/here">Link 1</a>
<a href="http://site.com/_myotherlink/goes/here">Link 2</a>

返回:

<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://进行尝试时无法使它起作用。

编辑:

只是提及一下,因为对我来说这很明显是此问题的“范围”的一部分,我想避免由于替换而产生url编码,因为我在其中一些代码中使用了{} ,而且我不希望他们中包含诸如%7B%7D之类的内容。

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

$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();

本质上,您正在寻找“ not ”模式。 那将是一个负面的断言

 (?!http://)

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

或者,您可以使用preg_replace_callback并在那里进行排序。


因为您说的是“解析”,所以有点像是话题。 替代方法是用于HTML遍历的 然后,您可以使用以下命令遍历所有链接:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM