嵌入正则表达式的链接和图像


Links and Images Embedding Regexes

SO 社区!

我是正则表达式的新手,我遇到了麻烦。我有一个聊天脚本,其中包含用户数据的简单解析器。可以使用BBCode标签嵌入图像,如下所示:[img]http://example.com/image.png[/img]。我还想自动将链接转换为有效的超链接。我有两个正在处理的正则表达式,我不知道如何解决它们之间的冲突。

为了处理[img]标签,我使用它,它首先执行:

$line = preg_replace('/'[img'](https?:'/'/[a-zA-Z0-9%'-_?&=:+.'/]+)'['/img']/iU', '<a href="$1" target="_blank"><img class="incl_img" src="$1"></a>', $line, 5);

然后为了处理链接,我使用它:

$line = preg_replace('#(https?:'/'/([a-zA-Z0-9-.]+)'/?[a-zA-Z0-9?&=.:'#'/'-_~%+]*)#e', '''[<a href="$1" title="$1" target="_blank">$2</a>]''',$line);

当用户发布图像时,链接处理正则表达式通过插入其<a href=...而不是链接来破坏<img>标签。如何在不使用特殊[url]标签或其他东西的情况下避免它?如何将[img]标签与简单链接分开?欢迎对正则表达式和/或算法进行任何更正。提前感谢!

试试这个小辅助函数:

function parseCode($txt)
{
   // these functions will clean the code first
   $ret = strip_tags($txt);
   // code replacements
   $ret = preg_replace('#'[link'=(.+)'](.+)'['/link']#iUs', '<a href="$1">$2</a>', $ret);
   $ret = preg_replace('#'[img'](.+)'['/img']#iUs', '<img src="$1" alt="Image" />', $ret);
   // return parsed string
   return $ret;
}

用法:

echo parseCode('[link=https://www.google.com]Click here to go to google[/link]');
echo "<br />";
echo parseCode('[img]https://www.google.co.uk/images/srpr/logo11w.png[/img]');

我解决了我的问题。解决方案是更正第二个正则表达式(URL 解析器)并添加一些条件。新的正则表达式将如下所示:

#(?<!src="|href=")(https?:'/'/([a-zA-Z0-9'-'.]+)'/?[a-zA-Z0-9?&=.:'#'/'-_~%+]*)#e'

整个代码变成了这样:

$line = preg_replace('#(?<!src="|href=")(https?:'/'/([a-zA-Z0-9'-'.]+)'/?[a-zA-Z0-9?&=.:'#'/'-_~%+]*)#e', '''[<a href="$1" title="$1" target="_blank">$2</a>]''',$line);