【问题标题】:Replacing all type of BBCODE image links into HTML image links将所有类型的 BBCODE 图片链接替换为 HTML 图片链接
【发布时间】:2019-07-07 08:56:57
【问题描述】:

我有这个脚本用于将 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);

这个 fork 链接,最终带有一些给定的扩展:.jpg .jpeg ...

但如果链接是这样的:[img]https://somelink/2/3/pic.jpg?w=bla[/img]

那么这个正则表达式模式就失败了。

对于所有类型的图像链接,什么是合适的模式?我试过了:

~\[img\](https?://.*?\.(?:jpg|jpeg|gif|png|bmp).*)\[/img\]~Us

但这也行不通

【问题讨论】:

  • 如果您想将 ?w=bla 添加到 src 失败,那么需要什么 src ?
  • 如果你想匹配所有可以跟随的,你可以使.*非贪婪到.*?以防止过度匹配并使e可选以省略1个交替\[img\](https?://.*?\.(?:jpe?g|gif|png|bmp).*?)\[/img\]见@987654321 @
  • 这就是你要找的东西Demo
  • 你可以使用this
  • 谢谢你们,你们的所有解决方案都有效。

标签: php regex


【解决方案1】:

如果查询字符串参数可能还包含[],则可以匹配问号\?,然后匹配直到遇到[/img],并使用所有格量词来防止不必要的回溯

说明

\[img\](https?://.*?\.(?:jpe?g|gif|png|bmp)(?:\?(?:[^[]++|\[(?!/img\]))*+)?)\[/img]
  • \[img\]匹配[img]
  • (抓包组
    • https?://.*? 匹配 http 与可选的 s、:// 和 0+ 次任意字符非贪婪
    • \.(?:jpe?g|gif|png|bmp) 匹配一个点和任何列出的选项
    • (?:非捕获组
      • \? 匹配?
      • (?:[^[]++|\[(?!/img\]))*+ 重复 0+ 次匹配不匹配 [ 或匹配 [ 当直接在右边的不是 /img]
    • )?关闭非捕获组并使其可选
  • )关闭捕获组
  • \[/img]匹配[/img]

Regex demo

【讨论】:

  • 非常感谢您的边缘案例解决方案和很好的解释
【解决方案2】:

你可以使用

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

Demo

你可以可视化regex here

注意:- 当您使用 U 标志时,您可以在量词之后安全地删除 ?,即

\[img\](https?://.*\.(?:jpe?g|gif|png|bmp).*)\[/img\]

【讨论】:

  • 不是顺便说一句,但这个解决方案不起作用。正如@Thefourthbird 所说,you could make the .* non greedy to .*?
  • @OTAR ~\[img\](https?://.*?\.(?:jpg|jpeg|gif|png|bmp).*)\[/img\]~Us 你已经选择了 U 标志,这意味着 unreddy(使量词变得懒惰)不是吗?
  • 是的,只是我有 https?://.*? 。所以在这种情况下应该从这里删除最后一个问号
  • ~\[img\](https?://.*\.(?:jpe?g|gif|png|bmp).*)\[/img\]~Us 这会起作用
  • @OTAR 是的,如果您使用 U 标志,您可以在任何量词之后安全地删除 ?
猜你喜欢
  • 1970-01-01
  • 2015-12-02
  • 2010-10-25
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多