Мне нужно сделать php-документ, который разбирает адрес электронной почты. Если у вас есть [email protected], например, это должно быть показано:
локальная часть: образец
хост: gmail
домен верхнего уровня: com
когда я запускаю этот код, второй оператор работает очень хорошо. Вместо "gmail" я получаю "gmail.com"
<?php $str=$_GET["email"];
echo "local-part: ".substr($str,0,strpos($str,"@"))."<br>";
echo "host: ".substr($str,strpos($str,"@")+1,strpos($str,"."))."<br>";
echo "top-level domain: ".substr($str,strpos($str,".")+1,strlen($str)); ?>
<form method = "GET" action = "index.php">
<input id = "mail" type = "text" size = "20" name = "email">
<input type=submit value = "submit" name = "submit">
</form>






Я думаю, что это проще и проще сделать с explode(). Разделите первую строку на @, затем разделите правую часть на .:
$str = '[email protected]';
[$localPart, $domain] = explode('@', $str);
[$host, $tld] = explode('.', $domain);
echo "Local part: $localPart\n";
echo "Host: $host\n";
echo "TLD: $tld\n";
Вывод:
Local part: sample
Host: gmail
TLD: com
Обратите внимание, что это работает, только если ваш домен двухуровневый. Если вы хотите обрабатывать такие вещи, как foo.gmail.com, вам понадобится немного больше:
[$localPart, $domain] = explode('@', $str);
$host = substr($domain, 0, strrpos($domain, '.'));
$tld = substr($domain, strrpos($domain, '.') + 1);
Вывод:
Local part: sample
Host: foo.gmail
TLD: com
Примечание. strpos() находит первое вхождение слева направо, а strrpos() — справа налево. Вы хотите, чтобы последний нашел TLD.
Другой пример:
[$localPart, $domain] = explode('@', $str);
$parts = explode('.', $domain);
$tld = array_pop($parts); // pop off the last thing in the list
$host = implode('.', $parts); // re-join the remaining items
сбой на [email protected] и многое другое, но я не говорю, что это не то, что хочет пользователь.
я все еще получаю TLD: co из приведенного выше, используя [email protected]
Спасибо. Я новичок в этом языке, поэтому я не знаю, сделал ли я что-то не так или переводчик.
@tim Ой, неправильно понял ваш комментарий. Предоставляются дополнительные образцы.
explode('.', 'foo.bar.baz', 2) >> ['foo', 'bar.baz']@ Sammitch Я предполагаю, что OP в этом случае хочет ['foo.bar', 'baz']. Было бы здорово, если бы вы могли указать отрицательное значение для этого аргумента, чтобы он сначала брал справа, а не слева.
@AlexHowansky на самом деле с такими адресами электронной почты, как [email protected] или [email protected], еще сложнее правильно разделить строку. На данный момент я думаю, что это проблема XY, и мы, вероятно, должны выяснить, почему они заботятся о TLD.
Ответ Алекса объясняет лучший способ сделать это, но чтобы ответить на ваш прямой вопрос о том, почему вы получаете «.com» с вашим хостом, причина в том, что функция substr() принимает длина в качестве своего третьего аргумента, а не положение для остановки в строке.
Если вы запустите:
echo strpos($str,".");
Он выведет число 13. Таким образом, ваша substr пытается захватить 13 символов которые следуют "@", в отличие от захвата вплоть до 13-го символа в строке.
Будьте осторожны при анализе электронных писем. Много подводных камней и непонятных правил.
Третий параметр — длина, но вы указываете позицию.
$length = strpos('.') - strpos('@');