识别第二个实例

identifying the second instance

我有这样的字符串:

[url=http://www.las-vegas.cc/weddings.php:1d5lzpq4]Las Vegas Wedding[/url:1d5lzpq4]

我需要清理它以使其有效 html,像这样:

<a href="http://www.las-vegas.cc/weddings.php" target="blank">Las Vegas Wedding</a>

我想到了使用正则表达式来完成肮脏的工作并想出了:

/\[url=(.+(?:))\](.*)\[\/url:.*\]/Ui

但这不能正常工作,因为我的结果是

1 - http://www.las-vegas.cc/weddings.php:1d5lzpq4
2 - Las Vegas Wedding

我应该如何修改我的正则表达式以删除 : 之后的部分? 它是字符串中 : 的第二个实例。

你可以使用这个模式:

~\[url=([^]]+):[^]]*](.*?)\[/url:[^]]*]~is

请注意,我没有从第一个字符 class 中排除 : 来处理 url 中的最终 login/pass 并确保找到最后 : 使用回溯。所以

$result = preg_replace('~\[url=([^]]+):[^]]*](.*?)\[/url:[^]]*]~is', '<a href=""></a>', $text);

部分详情:([^]]+):[^]]*]

[^]]是匹配除].

以外所有字符的字符class

[^]]+ 将匹配所有字符直到结束 ] 但正则表达式引擎将返回(回溯机制)直到它找到 : 使模式成功。

一旦完成,[^]]* 将匹配最后的字符直到结束 ]