Извлечь электронное письмо из длинного текста (PHP) - PullRequest
0 голосов
/ 07 мая 2020

Мне нужно найти способ извлечь адрес электронной почты из исходного кода веб-страницы.

    $str=  "<a h=ref=3D.mailto:rys@adres.pl.><img src=3D.http://www.lowiecki.pl/img/list.gif=
        . border=3D.0.></a></td><td class=3D.bb.>
        $a = preg_split( "/ [:] /", $str )";
    for($i=0;$i<count($a);$i++)
        echo $a[$i];

Я пробовал это, но не знаю, как установить ограничение на подстроку «pl».

Ответы [ 2 ]

0 голосов
/ 07 мая 2020

адреса электронной почты могут быть намного сложнее, чем формы, к которым мы привыкли, см. примеры необычных действительных адресов .

Почти идеальное, но очень сложное регулярное выражение для сопоставление большинства форм адресов электронной почты предлагается по адресу https://emailregex.com/.

Вы можете использовать это более короткое, но более ограничительное выражение, полученное из выражения, предложенного Яном Гойвертсом по адресу https://www.regular-expressions.info/email.html: /\b[A-Z0-9][A-Z0-9._%+-]{0,63}@(?:[A-Z0-9-]{1,63}\.){1,125}[A-Z]{2,63}\b/i

В сценарии PHP это может быть реализовано следующим образом:

<code><?php
$str = "<a h=ref=3D.mailto:rys@adres.pl.><img src=3D.http://www.lowiecki.pl/img/list.gif=
        . border=3D.0.></a></td><td class=3D.bb.><a h=ref=3D.mailto:second-address@example.com.>foo</a>";

preg_match_all(
    '/\b[A-Z0-9][A-Z0-9._%+-]{0,63}@(?:[A-Z0-9-]{1,63}\.){1,125}[A-Z]{2,63}\b/i', # After https://www.regular-expressions.info/email.html
    quoted_printable_decode($str), # An e-mail address may be corrupted by the quoted-printable encoding.
    $matches
);

echo isset($matches[0]) ? '<pre>'.print_r($matches[0], true).'
':' Адрес не найден. '; ?>

Этот скрипт выводит:

Array
(
    [0] => rys@adres.pl
    [1] => second-address@example.com
)

Обязательно позвоните по номеру $matches[0], чтобы получить найденные адреса.

С уважением

0 голосов
/ 07 мая 2020

Следующий код будет искать электронное письмо и сохранять его в переменной, после чего вы можете использовать результат как sh.

$email = preg_match_all(
  "/[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([\.-][a-z0-9]+)*)+\\.[a-z]{2,}/i",
  $str,
  $listofemails
);

if($email) {
   echo "you got a match";
}
...