使所有绝对链接相对
Make all absolute links relative
我正在寻找解决此问题的正则表达式。如果这样可以使事情变得更容易,它可以是一个多步骤解决方案。重要提示:测试字符串只是完整 HTML DOM 的一个片段,只有图像应该通过它来处理,任何其他 URL 应该单独保留。
这是一张图片:
<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">
作为单线:
<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 部分,我有
preg_replace("/(<img.*?src=\")(.*?)(\/wp-content.*?\")(.*>)/", '""', $string);
下面的答案是正确的。 大多数 HTML 文档应该可以加载。帮自己一个忙,尽量做到有效,无论如何这是一件好事。如果您不自己生产有问题的 HTML,请尝试在使用它之前对其进行处理。
对于数据源集问题,只需单独解析该参数即可。
完全比较您的 DOM 前后。 @dom->saveHTML()
方法使不需要关闭的关闭标签关闭。就像 <meta arg="yada"/>
变成 <meta arg="yada">
(缺少结束反斜杠)。另见 Are (non-void) self-closing tags valid in HTML5?
不要。 使用解析器分析 DOM 并直接在 DOM elements/attributes 上应用正则表达式。
<?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/)
我正在寻找解决此问题的正则表达式。如果这样可以使事情变得更容易,它可以是一个多步骤解决方案。重要提示:测试字符串只是完整 HTML DOM 的一个片段,只有图像应该通过它来处理,任何其他 URL 应该单独保留。
这是一张图片:
<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">
作为单线:
<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 部分,我有
preg_replace("/(<img.*?src=\")(.*?)(\/wp-content.*?\")(.*>)/", '""', $string);
下面的答案是正确的。 大多数 HTML 文档应该可以加载。帮自己一个忙,尽量做到有效,无论如何这是一件好事。如果您不自己生产有问题的 HTML,请尝试在使用它之前对其进行处理。
对于数据源集问题,只需单独解析该参数即可。
完全比较您的 DOM 前后。 @dom->saveHTML()
方法使不需要关闭的关闭标签关闭。就像 <meta arg="yada"/>
变成 <meta arg="yada">
(缺少结束反斜杠)。另见 Are (non-void) self-closing tags valid in HTML5?
不要。 使用解析器分析 DOM 并直接在 DOM elements/attributes 上应用正则表达式。
<?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/)