我在 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
。接下来,我们检查属性值是否以href
substrings或结尾.jpeg
,然后我们创建一个新标签,为其添加属性,一个带有属性的子元素,最后用新标签替换旧标签。.jpg
.png
a
img
a
如果在这里使用正则表达式,值得一试
正则表达式演示
细节
<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
.
jpeg
jpg
png
((?:\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 演示:
结果