我有这个脚本可以将BBCODE图像标签替换为HTML标签
$text = "[img]https://somelink/2/3/pic.jpg[/img]
[img]https://somelink/2/3/pic.jpg[/img]
[img]https://somelink/2/3/pic.jpg[/img]";
echo preg_replace(
'~\[img\](https?://.*?\.(?:jpg|jpeg|gif|png|bmp))\[/img\]~s',
'<img src="$1" alt="" />',
$text);
此分支用于链接,最终以某些给定的扩展名:.jpg
.jpeg
...
但是如果链接类似于:[img]https://somelink/2/3/pic.jpg
?w = bla [/img]
然后此正则表达式模式失败。
对于所有类型的图像链接,哪种模式合适?我尝试过:
~\[img\](https?://.*?\.(?:jpg|jpeg|gif|png|bmp).*)\[/img\]~Us
但这也不起作用
答案 0 :(得分:1)
您可以使用
Image.open(fh)
\[img\](https?://.*?\.(?:jpe?g|gif|png|bmp).*?)\[/img\]
-匹配\[img\]
[img]
-匹配包含以上任何扩展名的URL (https?://.*?\.(?:jpe?g|gif|png|bmp).*?)
-匹配\[/img\]
您可以可视化regex here
注意:-当您使用[/img]
标志时,可以安全地将U
移到量词之后,即
?
答案 1 :(得分:1)
如果查询字符串参数也可能包含[
或]
,则可以匹配问号\?
,然后匹配,直到遇到[/img]
为止使用所有格量词来防止不必要的回溯
说明
\[img\](https?://.*?\.(?:jpe?g|gif|png|bmp)(?:\?(?:[^[]++|\[(?!/img\]))*+)?)\[/img]
\[img\]
匹配[img]
(
捕获组
https?://.*?
将http与可选的s相匹配,://
并以0+乘以任何非char的字符\.(?:jpe?g|gif|png|bmp)
匹配点和列出的任何选项(?:
非捕获组
\?
匹配吗? (?:[^[]++|\[(?!/img\]))*+
重复0+次不匹配[
或匹配[
的情况,而不是直接在右边的/img]
)?
关闭非捕获组并将其设置为可选)
关闭捕获组\[/img]
匹配[/img]