使所有绝对链接相对

时间:2017-03-30 14:18:18

标签: php regex preg-replace pcre

我正在寻找这个问题的正则表达式解决方案。如果这使事情变得更容易,它可以是一个多步骤的解决方案重要提示:测试字符串只是一个完整HTML DOM的片段,只有图像应该由此解决,任何其他URL都应该保持不变。

这是一张图片:

decltype

作为oneliner:

<img 
src="https://www.example.com/de/wp-content/uploads/sites/1/2017/03/image.jpg"
data-srcset="
 https://www.example.com/de/wp-content/uploads/sites/1/2017/03/img1.jpg 507w,
 https://www.example.com/de/wp-content/uploads/sites/1/2017/03/img2.jpg 780w,
 https://www.example.com/de/wp-content/uploads/sites/74/2017/03/img3.jpg 950w"
data-sizes="
 (min-width: 80em) calc(0.5 * (100vw - (100vw- 57em))),
 (min-width: 48em) calc(0.5 * (100vw - 5em)),
 calc(100vw - 1em)"
alt="image" class="lazyload">

理想的结果是需要摆脱协议,域和第一个目录 - 也就是说:/ wp-content前面的所有内容。我这样做的语言是php。

对于src部分,我有

<img src="https://www.example.com/de/wp-content/uploads/sites/1/2017/03/image.jpg" data-srcset="https://www.example.com/de/wp-content/uploads/sites/1/2017/03/img1.jpg 507w, https://www.example.com/de/wp-content/uploads/sites/1/2017/03/img2.jpg 780w, https://www.example.com/de/wp-content/uploads/sites/74/2017/03/img3.jpg 950w" data-sizes="(min-width: 80em) calc(0.5 * (100vw - (100vw- 57em))), (min-width: 48em) calc(0.5 * (100vw - 5em)), calc(100vw - 1em)" alt="image" class="lazyload">

以下答案是正确的。大多数HTML文档都应该能够加载。帮自己一个忙,尽量做到尽可能有效,这无论如何都是好事。如果您自己没有生成有问题的HTML,请在使用之前尝试处理它。

对于data-srcset问题,只需单独解析该参数。

完全比较您之前和之后的DOM。 preg_replace("/(<img.*?src=\")(.*?)(\/wp-content.*?\")(.*>)/", '"$1$3$4"', $string); 方法生成不需要关闭,关闭的封闭标记。就像@dom->saveHTML()转向<meta arg="yada"/>一样(关闭反斜杠丢失)。另请参阅Are (non-void) self-closing tags valid in HTML5?

1 个答案:

答案 0 :(得分:0)

不要。使用解析器分析DOM并直接在DOM元素/属性上应用正则表达式。

<?php

$dom = new DOMDocument();
$dom->loadHTML($html, LIBXML_HTML_NOIMPLIED);

$xpath = new DOMXPath($dom);
$images = $xpath->query("//img[contains(@src, 'wp-content')]");

$regex = '~^.+?(?=/wp-content/)~';
foreach($images as $img) {
    $img->setAttribute('src', 
        preg_replace($regex, 'https://anotherdomain.com', $img->getAttribute('src'))
    );
}

echo $dom->saveHTML();

已经回答了十几次为什么用正则表达式解析HTML不是一个好主意,最受欢迎的答案之一是: RegEx match open tags except XHTML self-contained tags

<小时/> 但是,如果您的HTML无效,则可以使用以下正则表达式(在详细模式下):

(?:\G(?!\A)|<img)
(?s:.+?\bsrc=['"])\K
https?://.+?(?=/wp-content/)

working on regex101.com