将所有类型的BBCODE图像链接替换为HTML图像链接

时间:2019-07-07 08:56:57

标签: php regex

我有这个脚本可以将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

但这也不起作用

2 个答案:

答案 0 :(得分:1)

您可以使用

Image.open(fh)
  • \[img\](https?://.*?\.(?:jpe?g|gif|png|bmp).*?)\[/img\] -匹配\[img\]
  • [img]-匹配包含以上任何扩展名的URL
  • (https?://.*?\.(?:jpe?g|gif|png|bmp).*?)-匹配\[/img\]

Demo

您可以可视化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]

Regex demo