我在 PHP 中工作。您需要替换所有扩展名为 jpg、png 等的链接。我这样做:
$row["message"] = preg_replace('/<a\shref=\"(.+?[jpeg|jpg|png])\"\starget=\"_blank\">(.+?)<\/a>/is', '<a data-fancybox="gallery" href="$1"><img src="$1" alt="" class="tmp_class"></a>', $row["message"]);
用于测试以下行:
<p>С этой формы приходят заявки <a href="https://site.com/lack_tech.php">https://site.com/lack_tech.php</a></p>
<p>Или что ты имеешь ввиду?</p>
<div class="attachment_files_message">
<p>Прикреплённые файлы:</p>
<a href="http://site.com/public/uploads/kylticket/2670/Screenshot_1.png" target="_blank">Screenshot_1.png</a>
</div>
也就是说,您需要替换第二个链接,根据我的代码,链接开头<a href="....和最后一个结束标记之间的所有内容都被替换</a>
该模式
[jpeg|jpg|png]是相同的[jegnp|],因为它[...]是一个字符类,它匹配该类中指定的字符中的 1 个字符。它.+?也可能捕获过多的文本,因为点匹配任何字符。如果替换
\"(.+?[jpeg|jpg|png])\"为"([^"]*\.(?:jpe?g|png))",错误将消失,但在某些情况下,此表达式仍然不起作用(不同数量的空白字符、属性的缺失或位置在不同的位置target=\"_blank\")。DOMDocument在这种情况下,基于解决方案似乎更合适。见 PHP 演示:
结果
在
foreach ($xpath->query('//a[@target="_blank"]') as $OurNode)我们正在寻找a属性target等于的所有标签_blank。接下来,我们检查属性值是否以hrefsubstrings或结尾.jpeg,然后我们创建一个新标签,为其添加属性,一个带有属性的子元素,最后用新标签替换旧标签。.jpg.pngaimga如果在这里使用正则表达式,值得一试
正则表达式演示
细节
<a- 子串<a\s+- 1+ 空白字符((?:[^\s<>'"=]+(?:=(?:"[^"]*"|'[^']*'|[^\s'">]+))?\s+)*)- 捕获子模式#1:具有可选值的属性的 0 次或多次重复(即它可以是类似的东西required,target='_blank'等等)href=(?|"([^"]*\.(?:jpe?g|png))"|'([^']*\.(?:jpe?g|png))'|([^\s'">]*\.(?:jpe?g|png))(?=[>\s]))-=后跟可选引号'/"和捕获子模式 #2,它捕获'...'/"..."或非空白字符内的文本',如果值以+结尾,或者">href.jpegjpgpng((?:\s+[^\s<>'"=]+(?:=(?:"[^"]*"|'[^']*'|[^\s'">]+))?)*)- 捕获子模式#3:具有可选值的 0 次或更多属性重复(即可能是required, target='_blank' 等)\s*>- 0+ 空白字符和>(.*?)- 捕获子模式 #4:第一次出现之前的 0 个或多个任意字符</a>- 子串</a>。您需要将匹配替换为
<a $1$3 data-fancybox="gallery" href="$2"><img src="$2" alt="" class="tmp_class"></a>,因为在捕获组 #1 和 #3 中可能还有其他属性。另请参阅 PHP 演示:
结果