#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"
}
}
Ответ №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.