Метод substr не работает с strpos в php

Мне нужно сделать 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>

Третий параметр — длина, но вы указываете позицию. $length = strpos('.') - strpos('@');

Sammitch 17.01.2019 23:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
215
2

Ответы 2

Я думаю, что это проще и проще сделать с 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] и многое другое, но я не говорю, что это не то, что хочет пользователь.

user10051234 17.01.2019 22:53

я все еще получаю TLD: co из приведенного выше, используя [email protected]

user10051234 17.01.2019 22:57

Спасибо. Я новичок в этом языке, поэтому я не знаю, сделал ли я что-то не так или переводчик.

Miles Lelek 17.01.2019 23:02

@tim Ой, неправильно понял ваш комментарий. Предоставляются дополнительные образцы.

Alex Howansky 17.01.2019 23:03
explode('.', 'foo.bar.baz', 2) >> ['foo', 'bar.baz']
Sammitch 17.01.2019 23:25

@ Sammitch Я предполагаю, что OP в этом случае хочет ['foo.bar', 'baz']. Было бы здорово, если бы вы могли указать отрицательное значение для этого аргумента, чтобы он сначала брал справа, а не слева.

Alex Howansky 17.01.2019 23:32

@AlexHowansky на самом деле с такими адресами электронной почты, как [email protected] или [email protected], еще сложнее правильно разделить строку. На данный момент я думаю, что это проблема XY, и мы, вероятно, должны выяснить, почему они заботятся о TLD.

Sammitch 17.01.2019 23:44

Ответ Алекса объясняет лучший способ сделать это, но чтобы ответить на ваш прямой вопрос о том, почему вы получаете «.com» с вашим хостом, причина в том, что функция substr() принимает длина в качестве своего третьего аргумента, а не положение для остановки в строке.

Если вы запустите:

echo strpos($str,".");

Он выведет число 13. Таким образом, ваша substr пытается захватить 13 символов которые следуют "@", в отличие от захвата вплоть до 13-го символа в строке.

Будьте осторожны при анализе электронных писем. Много подводных камней и непонятных правил.

Другие вопросы по теме