我正在尝试在用户发布到我的在线论坛的文本中查找电子邮件地址,并将其更改为公告板代码 (BBCode)。例如:
example@yahoo.com
会成为:
[mail]exmaple@yahoo.com[/mail]
但是我不想更改已经在 BBCode 中的电子邮件地址。例如,我不想要:
[mail]exmaple@yahoo.com[/mail]
成为:
[mail][mail]exmaple@yahoo.com[/mail][/mail]
因此,我需要在我的正则表达式中添加一个否定的后向断言,以确保电子邮件地址前面没有字符 [mail](或只是 ])。
我正在使用的 PHP 代码是:
$pattern = '#(?<!])([a-zA-Z0-9_\-\.]*@\S+\.\w+)#';
$bbcode = '[mail]$1[/mail]';
preg_replace($pattern, $bbcode, $text);
我遇到的问题是负面的后视仅适用于电子邮件地址寻求子模式的第一个字符。例如,当应用于文本时:
[mail]example@yahoo.com[/mail]
结果是:
[mail]e[mail]xample@yahoo.com[/mail][/mail]
因此,负向查找会找到 [mail]e,但电子邮件地址 xample@yahoo.com 的其余部分仍然有效。我意识到这是因为电子邮件地址寻求子模式的编写方式,因为它允许在 @ 之前有任意数量的字符。
如何更改正则表达式以使否定后向适用于寻求子模式的整个电子邮件地址,同时仍成功捕获大多数发布的电子邮件地址?