Регулярное выражение для извлечения адреса mailto:

Мне нужен reg exp, который может принимать блок строк и находить строки, соответствующие формату:

<a href="mailto:[email protected]">....</a>

И для всех строк, которые соответствуют этому формату, он извлечет адрес электронной почты, найденный после mailto:. Какие-нибудь мысли?

Это необходимо для внутреннего приложения, а не для спамерских целей!


person Ali    schedule 03.09.2009    source источник


Ответы (5)


Если вы хотите сопоставить все это из:

$r = '`\<a([^>]+)href\=\"mailto\:([^">]+)\"([^>]*)\>(.*?)\<\/a\>`ism';
preg_match_all($r,$html, $matches, PREG_SET_ORDER);

Чтобы ускорить и сократить его:

$r = '`\<a([^>]+)href\=\"mailto\:([^">]+)\"([^>]*)\>`ism';
preg_match_all($r,$html, $matches, PREG_SET_ORDER);

Второй подходящей группой будет любой адрес электронной почты.

Пример:

$html ='<div><a href="mailto:[email protected]">test</a></div>';

$r = '`\<a([^>]+)href\=\"mailto\:([^">]+)\"([^>]*)\>(.*?)\<\/a\>`ism';
preg_match_all($r,$html, $matches, PREG_SET_ORDER);
var_dump($matches);

Выход:

array(1) {
  [0]=>
  array(5) {
    [0]=>
    string(39) "test"
    [1]=>
    string(1) " "
    [2]=>
    string(13) "[email protected]"
    [3]=>
    string(0) ""
    [4]=>
    string(4) "test"
  }
}
person mauris    schedule 04.09.2009

На regexp.info есть множество различных вариантов.

Одним из примеров может быть:

\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,4}\b

«mailto:» тривиально добавить к этому.

person exhuma    schedule 03.09.2009
comment
Это регулярное выражение соответствует только заглавным буквам, поэтому обязательно используйте флаг нечувствительности к регистру. В качестве альтернативы рассмотрите возможность добавления строчной буквы в регулярное выражение. - person Asaph; 04.09.2009
comment
Можете ли вы добавить mailto:, а также переключатель нечувствительности к регистру, который вызвал asaph? Я не знаком с синтаксисом регулярных выражений, поэтому я не могу его исправить, даже если это тривиально - person Ali; 04.09.2009

/(mailto:)(.+)(\")/

Вторая совпадающая группа будет адресом электронной почты.

person Doug Hays    schedule 03.09.2009
comment
какую функцию я должен использовать с этим, preg_match? - person Ali; 04.09.2009

Вы можете работать с внутренним фильтром PHP http://us3.php.net/manual/en/book.filter.php

(у них есть один, специально предназначенный для проверки или очистки электронной почты -> FILTER_VALIDATE_EMAIL)

Приветствует

person Community    schedule 03.09.2009
comment
Как это позволит извлечь письмо? - person Ali; 04.09.2009

для меня работал ~<mailto(.*?)>~ вернет массив, содержащий найденные элементы. Здесь вы можете проверить это: https://regex101.com/r/rTmKR4/1

person Gabriel    schedule 30.07.2020