Заменяющий с помощью всего лишь адреса электронной почты
Вопрос
Я хочу заменить все ссылки "mailto:" в html обычными электронными письмами.
In: text .... <a href="mailto:somebody@example.org">not needed</a> text
Out: text .... somebody@example.org text
Я сделал это:
$str = preg_replace("/\<a.+href=\"mailto:(.*)\".+\<\/a\>/", "$1", $str);
Но это не удается, если внутри тега "a" есть несколько электронных писем в виде строки или html-кода
In: <a href="mailto:hello@somedomain.org">not needed</a><a href="mailto:somebody@example.org"><font size="3">somebody@example.org</font></a>
Out: somebody@example.org">
Решение
Составьте свою пару нежадный путем добавления ?
к квантификаторам +
и *
как:
$str = preg_replace("/\<a.+?href=\"mailto:(.*?)\".+?\<\/a\>/", "$1", $str);
Также вам не нужно убегать <
и >
и поскольку есть некоторые /
в шаблоне лучше использовать другой разделитель, и поскольку вы не выполняете никакой интерполяции переменных внутри шаблона, нет необходимости заключать его в "
таким образом, вы можете избежать побега "
внутри шаблона:
$str = preg_replace('#<a.+?href="mailto:(.*?)".+?</a>#', "$1", $str);
Не связан с StackOverflow