Я пытаюсь найти адреса электронной почты в тексте, опубликованном пользователями на моем онлайн-форуме, и изменить их на код доски объявлений (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 все еще проверяет.Я полагаю, что это из-за того, как написан под-шаблон поиска адреса электронной почты, потому что он допускает любое количество символов перед @.
Как я могу изменить регулярное выражение, чтобы отрицательный взгляд применялся ко всему под-шаблону поиска адреса электронной почты, при этом все еще успешно перехватывая большинство отправляемых адресов электронной почты?