Заменяющий с помощью всего лишь адреса электронной почты

StackOverflow https://stackoverflow.com/questions/2529858

  •  22-09-2019
  •  | 
  •  

Вопрос

Я хочу заменить все ссылки "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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top