Извлечение электронной почты: передача из строки

#php

#php

Вопрос:

У меня есть текст, подобный приведенному ниже примеру

 $text = "rami@gmail.com:Password
This email is from Gmail
email subscription is valid 

omar@yahoo.com:password 
this email is from yahoo 
email subscription is valid ";
  

Я хочу иметь возможность извлекать все вхождения email: password в тексте без остальной части описания.
Я попробовал preg_match, но он вернул 0 результатов, а explode возвращает весь текст с описанием.

Любая помощь приветствуется

Разнесите
Str_Pos
Preg_match

 $text = "rami@gmail.com:Password
This email is from Gmail
email subscription is valid 

omar@yahoo.com:password 
this email is from yahoo 
email subscription is valid ";
  

Комментарии:

1. Покажите вашу попытку preg_match .

2. пользователь вы видели приведенный выше запрос на публикацию кода, который вы пробовали?

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

4. В вашем вопросе отсутствуют важные ингредиенты, такие как ТОЧНЫЙ желаемый результат и ваша лучшая попытка кодирования.

Ответ №1:

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

 preg_match_all("/(.*@.*):(.*?)s*n/", $text, $matches);
$matches = array_combine(["match", "email", "password"], $matches);
var_dump($matches);
  

Вывод:

 array(3) {
  ["match"]=>
  array(2) {
    [0]=>
    string(24) "rami@gmail.com:Password
"
    [1]=>
    string(25) "omar@yahoo.com:password 
"
  }
  ["email"]=>
  array(2) {
    [0]=>
    string(14) "rami@gmail.com"
    [1]=>
    string(14) "omar@yahoo.com"
  }
  ["password"]=>
  array(2) {
    [0]=>
    string(8) "Password"
    [1]=>
    string(8) "password"
  }
}
  

https://3v4l.org/baeQ0

Ответ №2:

Трудно быть уверенным / точным, когда имеешь дело с нереалистичными строками ввода, но этот шаблон извлекает (не проверяет) email:password строки для вас.

Сопоставьте с начала строки, сопоставьте известные символы, а в классах отрицаемых символов включите пробельные символы, чтобы предотвратить сопоставление со следующей строкой. Вы могли бы использовать n вместо s , если хотите.

Код: (демо)

 $text = "rami@gmail.com:Password
This email is from Gmail
email subscription is valid 

omar@yahoo.com:password 
this email is from yahoo 
email subscription is valid ";

var_export(preg_match_all('~^[^@s] @[^:s] :S ~m', $text, $matches) ? $matches[0]: "none");
  

Вывод:

 array (
  0 => 'rami@gmail.com:Password',
  1 => 'omar@yahoo.com:password',
)
  

…хм, я думаю, это нормально разрешать пробелы в пароле, но если это так, то вы не можете логически обрезать любые пробелы с правой стороны пароля. Альтернативный шаблон для разрешения пробелов, который также предоставляет отдельные группы захвата, может выглядеть следующим образом: (Смотрите демонстрацию с fringe case, где символы пароля требуют определенной логики шаблона, чтобы предотвратить жадное сопоставление в первой группе захвата.)

 var_export(preg_match_all('~([^@s] @[^:s] ):(.*)~', $text, $matches, PREG_SET_ORDER) ? $matches: "none");
  

Я предпочитаю отрицаемые символьные классы [^...] вместо . (любой символьной точки), потому что это позволяет использовать жадные кванторы — это повышает эффективность шаблона (во всяком случае, с точки зрения количества шагов).

Комментарии:

1. Я собирался воздержаться от вашего ответа, пока вопрос не будет улучшен, но Абдур заставил меня.

2. Я также ждал попытки. Или, по крайней мере, комментарий из OP.