#php #arrays #preg-match-all
#php #массивы #preg-match-all
Вопрос:
У меня есть функция pregmatch_all, которая очищает электронные письма! Но вывод довольно странно структурирован, и мне не удается его реструктурировать.
$str = "Service Client ouvert : du lundi au vendredi de 9h à 20h le samedi de 9h à 18h 01 75 85 83 83 hello@soshape.com So Shape France / Site créé par KL Consult"
$pattern = '/[a-z0-9_- .] @[a-z0-9-] .([a-z]{2,4})(?:.[a-z]{2})?/i';
$preg_match_all($pattern, $str, $output);
print_r($output);
ВОЗВРАТ
Array ( [0] => Array ( [0] => hello@soshape.com ) [1] => Array ( [0] => com ) )
Пожалуйста, две вещи:
- Как я могу избавиться от массива «com»?
- Как я могу реструктурировать массив, чтобы получить: Array ( [0] => hello@soshape.com )
Есть идея? (если мой вопрос неясен, не стесняйтесь, дайте мне знать. Я буду рад объяснить дальше !)
Комментарии:
1. Добавьте необязательный параметр для другого вывода.
preg_match_all($pattern, $str, $output, PREG_PATTERN_ORDER);
.
Ответ №1:
Как написал Маркус в комментарии, давайте посмотрим на PREG_PATTERN_ORDER
флаг:
Упорядочивает результаты так, чтобы $matches[0] был массивом полных совпадений с шаблоном, $matches [1] — массив строк, которым соответствует первый заключенный в скобки подшаблон, и так далее.
Из документации здесь
Потому что ваш шаблон, включенный ()
как в ([a-z]{2,4})
.com
, также улавливается.
Если вам нужны только электронные письма, вы можете использовать PREG_PATTERN_ORDER
, который вернет совпадения в индексе 0 возвращаемого массива (поскольку вам не нужен заключенный в скобки подшаблон, вы можете игнорировать следующие индексы)
Итак, вы можете сделать:
$preg_match_all($pattern, $str, $output, PREG_PATTERN_ORDER);
print_r($output[0]);