PHP найти строку в известных символах

Пожалуйста, проверьте следующее:

$email  = 'name@example.com';
$domain = strstr($email, '@');
echo $domain; // prints @example.com

Есть ли способ вернуть @example без.com?

Итак, в основном мне нужно искать в строке набор символов, которые я не знаю, которые существуют между набором символов, которые я действительно знаю.

Итак, в следующем я хочу вернуть "собаку":

$ string = "Раньше у меня была домашняя собака с именем spot";

Я могу получить последний раздел строки, используя:

$pet_type = strstr($string, 'pet ');

Это возможно?

8 ответов

Решение

Или использовать 2 раза взорваться

$email  = 'name@example.com';
        $email  = explode( '@', $email);
        $email = explode('.', $email[1]);

        $email = $email[0];
        echo $email;

возвращает: пример

Вы сами отвечаете на вопрос в тегах. Используя regex/preg_match, вы можете искать шаблоны и извлекать соответствующие значения.

Вот введение в регулярные выражения, оно может выглядеть довольно устрашающе, но не будьте священным, это вполне логично:)

Для вашего примера с доменом вы можете сделать что-то вроде этого:

preg_match("@[^\.]+", $email, $matches);
$domain = $matches[0];

Я часто использую это, потому что это делает регулярные выражения намного проще. Вы можете добавить ^ в диапазон, чтобы инвертировать его. [^aeiou] - это диапазон ВСЕХ символов, кроме a, e, i, o и u.

Для вашего примера попробуйте

@[^\.]+

Это будет соответствовать "@example".

$email = 'name@host.com';
$at_pos = strpos($email, '@');
$dot_pos = strpos($email,'.');
$domain_length = $dot_pos - $at_pos;
$domain = substr($email,$at_pos,$domain_length);
echo $domain;
preg_match('/\@([a-zA-Z0-9-]+)?/', 'test@site-test.com', $matches);

Array ( [0] => @site [1] => site )

$matches[0] это то, что вы хотите использовать.

Пытаться substr() в сочетании с strpos()

$start = strpos($email, '@');
$length = strpos($email, '.com') - $start;
$domain = substr($email, $start, $length);

Вам нужны регулярные выражения.

preg_match('/@(\w+)\.com/', $email, $match);
$domain = $match[1];

Смотрите: http://www.php.net/manual/fr/book.pcre.php

В основном в preg_match() позвоните, я проверяю, если строка $email имеет следующую последовательность: символ at, затем любое положительное число символов слова, захваченных в группе с помощью скобок ((\w+)), затем точка (сбежала: \.) и наконец, com, Если совпадение прошло успешно, группы захвата помещаются в $match массив и может быть получен с использованием их индекса позиции слева направо.

Шаблон соответствия может быть улучшен в зависимости от типа символов, которые вы ожидаете при вводе. В целом, REGEX'ы медленнее, чем простые замены строк, но намного, намного мощнее. Стоит узнать, как они работают.

Вы можете попробовать:

$str = '';
$email  = 'name@example.com';
$domain = strstr($email, '@');
$domain = str_split($domain);
foreach($domain as $split){
$str .= $split;
if($split == '.'){
break;
}
}
echo $str; // prints @example

или же:

$email  = 'name@example.com';
$email = strstr($email, '@');
$email = explode(".", $domain);
echo $email[0]; // prints @example
Другие вопросы по тегам