кодек
$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($myArray));
$result = array();
foreach ($ritit as $leafValue) {
$keys = array();
foreach (range(0, $ritit->getDepth()) as $depth) {
$keys[] = $ritit->getSubIterator($depth)->key();
}
$result[ join('.', $keys) ] = $leafValue;
}
выход
Array
(
[key1] => value1
[key2.subkey] => subkeyval
[key3] => value3
[key4.subkey4.subsubkey4] => subsubkeyval4
[key4.subkey4.subsubkey5] => subsubkeyval5
[key4.subkey5] => subkeyval5
)
демо: http://codepad.org/YiygqxTM
Мне нужно иди, но если тебе понадобится объяснение этого завтра, спроси меня.
Вы можете просто разделить строку электронной почты на запятую и проверить каждый адрес электронной почты с помощью простого (или огромного) регулярного выражения электронной почты. Или попробуйте создать объект MailAddress
; он также поддерживает некоторую базовую проверку адреса.
Это код, который у нас есть на производстве (для вас даже добавлена запятая). Обычно вы не должны использовать try / catch для проверки, но здесь это хорошо работает. Я считаю, что это лучше, чем пытаться перекодировать валидатор.
string[] allToAddresses = to.Split(";,".ToCharArray(),
StringSplitOptions.RemoveEmptyEntries)
foreach (string toAddress in allToAddresses)
{
try
{
message.To.Add(toAddress);
}
catch (FormatException)
{
//do nothing, illformed address. screw it.
}
}
В настоящее время мы используем следующую функцию, и она работает для нас достаточно хорошо :)
public static bool IsValidEmail(string email)
{
// source: http://thedailywtf.com/Articles/Validating_Email_Addresses.aspx
Regex rx = new Regex(
@"^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](\.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*@[a-zA-Z](-?[a-zA-Z0-9])*(\.[a-zA-Z](-?[a-zA-Z0-9])*)+$");
return rx.IsMatch(email);
}
Пожалуйста используйте это:
(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])
Следующее будет проверять правильность формы адреса электронной почты (не существующего на самом деле ):
private bool isEmail(string inputEmail)
{
Regex re = new Regex(@"^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$",
RegexOptions.IgnoreCase);
return re.IsMatch(inputEmail);
}
Я обновил это, добавив более простое выражение (включая нечувствительность к регистру), чтобы, надеюсь, сделать его немного яснее.
Ниже приведены основы кода, который проверяет, что домен действительно существует:
private bool isRealDomain(string inputEmail)
{
bool isReal = false;
try
{
string[] host = (inputEmail.Split('@'));
string hostname = host[1];
IPHostEntry IPhst = Dns.GetHostEntry(hostname);
IPEndPoint endPt = new IPEndPoint(IPhst.AddressList[0], 25);
Socket s = new Socket(endPt.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
s.Connect(endPt);
s.Close();
isReal = true;
}
catch (<specific exceptions here>)
{
}
return isReal;
}
Вы можете сделать гораздо больше, например, пытаясь подключиться, чтобы убедиться, что домен будет получать почту. Кроме того, вам необходимо убедиться, что вы перехватываете необходимые исключения и правильно их обрабатываете.
Да, разделите строку электронных писем по разделителю, а затем подтвердите каждый адрес электронной почты. вот пример, он не будет работать на втором адресе электронной почты (foo # bar.com). Я использовал регулярное выражение из элемента управления регулярным выражением asp.net для проверки адресов.
String email = "bar@foo.com;foo#bar.com";
String expression = @"\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";
Regex regex = new Regex(expression);
String[] emails = email.Split(new Char[] { ';' });
foreach (String s in emails)
{
Match m = regex.Match(s);
if (!m.Success)
{
// Validation fails.
}
}