我正在寻找这个问题的正则表达式解决方案。如果这使事情变得更容易,它可以是一个多步骤的解决方案重要提示:测试字符串只是一个完整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?
答案 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/)