Как эффективно извлекать имена и электронные письма из списка контактов?

#php

#php

Вопрос:

Я хотел бы разрешить пользователям вставлять список контактов, разделенных новой строкой, и эффективно генерировать массив имен и электронных писем.

Допустим, возможности записей:

 John, foo@corp.com
foo@corp.com, John
John foo@corp.com
foo@corp.com John
foo@corp.com // will have the [name] key empty
John // will not be considered if there is no email
 

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

Массив, который я пытаюсь придумать, выглядит так:

 array(
 [0] => array(
         [name] => John,
         [email] => foo@corp.com
        )
 [1] => ...
)
 

Есть идеи?

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

1. Довольно большой фрагмент кода для обдумывания, но вам, очевидно, понадобятся регулярные выражения и explode

2. как насчет возможности John,foo@corp.com ?

Ответ №1:

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

http://www.php.net/manual/en/function.preg-split.php

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

 $array = preg_split('#[ |,] #', $input);
 

Затем вы можете проверить каждое поле с помощью filter_var(), чтобы узнать, какой адрес электронной почты.

 filter_var('bob@example.com', FILTER_VALIDATE_EMAIL);
 

http://www.php.net/manual/en/function .filter-var.php

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

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

Ответ №2:

Можно попробовать сделать что-то вроде этого:

  1. Прочитайте файл построчно (это файл? Или просто текстовую строку?)
  2. Разнесите пробелами.
  3. для каждого массива, созданного с помощью функции explode, проверьте, является ли это адресом электронной почты или нет (например, с помощью этой функции) Если он действителен, то вы знаете, что это адрес электронной почты, в противном случае это имя.
  4. Вы также можете затем «очистить» имя (например, удалить «,»)

Ответ №3:

Хммм, вот общая идея, которую я придумал:

  1. Найдите в строке последний символ @ (на случай, если кто-то использует глупое имя, содержащее в нем @, потому что людям нравится это делать). Электронное письмо может содержать только один символ @; если оно содержит более одного, оно не будет действительным электронным письмом.
  2. Найдите первый пробел слева от символа @. Хотя адрес электронной почты может содержать пробел, большинство почтовых серверов обрабатывают их неправильно, и многие почтовые провайдеры вообще запрещают использовать пробелы, поэтому, как правило, можно с уверенностью сказать, что ни один адрес электронной почты не будет содержать пробел.
  3. Разделите строку на два по этому символу (вы можете просто использовать substr() для этого, перейдя от 0 к позиции этого символа, а затем к позиции этого символа плюс один до конца). Вы получите первую часть, которая представляет собой все имя, которое может содержать имя, фамилию или другую информацию. Второй частью будет адрес электронной почты. Если слева от символа @ нет пробела, то вы можете подразумевать, что имя не было указано.
  4. Обрежьте лишние пробелы и запятые в начале и конце обеих строк (на всякий случай).
  5. Вы должны проверить, что часть адреса электронной почты фактически отформатирована как адрес электронной почты, используя регулярное выражение.

Если вы [действительно] хотите добавить поддержку символа пробела, вы всегда можете посмотреть на символ слева от символа @ и, если это двойная кавычка, продолжить поиск слева до второй двойной кавычки. Адреса электронной почты, содержащие пробелы, записываются как "contains a space"@example.com