Странная структура массива в выводе preg_match_all PHP

#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]);