2013-05-20 2 views
2

Это часть функции для проверки адресов электронной почты в phpbb. У меня есть VALID адрес электронной почтыRegex для адреса электронной почты не принимается '&' before 'dot'

"pwd-p & r2.coop @ ...", но он не принят валидацией.

Самое интересное, что когда я попытался "pwd-pr2.co & оп @ ..." (с '&' после 'точки')

и «PWD пр & 2coop @ ... «(без« точки »), оба действительны,

но« pwd-pr & 2.coop @ ... »(с« точкой »после« & ') нет.

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

function get_preg_expression($mode) 
{ 
    switch ($mode) 
    { 
     case 'email': 
     // Regex written by James Watts and Francisco Jose Martin Moreno 
     // http://fightingforalostcause.net/misc/2006/compare-email-regex.php 
     return '([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*(?:[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]|&)[email protected]((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)'; 
    break; 
    } 
} 
+0

'&' не является специальным символом в регулярном выражении, поэтому вам не нужно его избегать – Stephan

+0

Я не могу подтвердить, для меня он соответствует 'pwd-p & r2.coop @ ...'. Какой движок регулярного выражения вы используете (какой язык программирования)? Существуют ли дополнительные ограничения для принятия валидации, кроме регулярного выражения? – Bergi

+0

@ted: Нет. Предложенное там регулярное выражение явно не соответствует действительным адресам OP. Скорее взгляните на http://davidcel.is/blog/2012/09/06/stop-validating-email-addresses-with-regex/ – Bergi

ответ

1

Попробуйте это:

function get_preg_expression($mode) 
{ 
    switch ($mode) 
    { 
     case 'email': 
     // Regex written by James Watts and Francisco Jose Martin Moreno 
     // http://fightingforalostcause.net/misc/2006/compare-email-regex.php 
     // return '^(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&)+$'; 
     return '(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&)[email protected]((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)'; 
    break; 
    } 
} 

Я незаменяемые символы, которые не нужно бежать в ведущих выражениях брекет. Кажется, это трюк. Более конкретно, единственными оставленными мной символами были: (a) ', из-за синтаксиса строки строки PHP, и (b) /, потому что я использовал / в качестве предварительного разделителя PHP.

У меня нет теории о том, почему эта неудача помогла, к сожалению. Однако лучше всего избегать того, что нужно ускользнуть, поэтому я пришел к решению в свете того, что вы «должны» делать, поэтому мне удобно делиться. Ответ не удовлетворяет, но, по крайней мере, он работает.

Вот тестовая я использовал для тестирования, в случае, если это полезно, плюс matchiness:

function get_preg_expression($mode) 
{ 
    switch ($mode) 
    { 
     case 'email': 
     // Regex written by James Watts and Francisco Jose Martin Moreno 
     // http://fightingforalostcause.net/misc/2006/compare-email-regex.php 
     // return '^(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&)+$'; 
     return '(?:[\w!#$%&\'*+-\/=?^`{|}~]+\.)*(?:[\w!#$%&\'*+-\/=?^`{|}~]|&)[email protected]((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,63})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)'; 
    break; 
    } 
} 

var_dump(preg_match('/' . get_preg_expression('email') . '/', 'pwd-pr&[email protected]')); // Matches 
var_dump(preg_match('/' . get_preg_expression('email') . '/', 'pwd-pr&[email protected]')); // Matches 
var_dump(preg_match('/' . get_preg_expression('email') . '/', 'pwd-p&[email protected]')); // Matches 
var_dump(preg_match('/' . get_preg_expression('email') . '/', 'hello')); // Does not match 
var_dump(preg_match('/' . get_preg_expression('email') . '/', '[email protected]')); // Does not match 
var_dump(preg_match('/' . get_preg_expression('email') . '/', '[email protected]')); // Matches 
+1

Я не видел вашего ответа несколько минут назад. Я только что проверил ваше регулярное выражение. Он работает очень хорошо. Спасибо! – Anh

+0

Рад, что это помогло! – sigpwned

3

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

PHP имеет встроенный модуль проверки подлинности электронной почты в виде функции filter_var(). Это, как правило, лучший вариант для проверки электронной почты.

Это однострочный фрагмент кода без каких-либо сложных регулярных выражений.

Примеры скопированные из приведенной выше ссылке (то есть PHP инструкции):

<?php 
$email_a = '[email protected]'; 
$email_b = 'bogus'; 

if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) { 
    echo "This (email_a) email address is considered valid."; 
} 
if (filter_var($email_b, FILTER_VALIDATE_EMAIL)) { 
    echo "This (email_b) email address is considered valid."; 
} 
?> 

Надежда, что помогает.

+0

Это, безусловно, Right Thing для PHP вообще (так +1), но будет ли он работать в контексте необходимости OP для phpBB? AFAIK, phpBB обрабатывает много проверок с помощью регулярных выражений, поэтому правильный ответ может не работать в этом случае. OP, можете ли вы подтвердить, что это работает для ваших нужд? – sigpwned

+0

@Spudley: Это правда, что filter_var() отлично работает. Раньше я это делал. Тем не менее, я использую код phpBB, поэтому трудно исправить все, что уже построено. Но спасибо! – Anh

+0

@sigpwned: Вы совершенно правы. Я все еще пытаюсь использовать другое регулярное выражение, чтобы исправить это. – Anh

Смежные вопросы