2014-02-21 8 views
1

Недавно я обновился до PHP 5.3 и получил некоторые устаревшие ошибки.preg_match() [function.preg-match]: Неизвестный модификатор '@'

Warning: preg_match() [function.preg-match]: Unknown modifier '@' in 

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

preg_match(): Unknown modifier '@' и How can I convert ereg expressions to preg in PHP?

... Но когда я делал изменения от

function check_email_address($email) { 

if (!ereg("^[^@]{1,64}@[^@]{1,255}$", $email)) { 

в

function check_email_address($email) { 

if (preg_match("/^[^@]{1,64}@[^@]{1,255}$/", $email)) { 

, а также пытались

if (preg_match('/^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i', $email); 

моя страница регистрации не принимает электронные письма и говорит, что есть недопустимое письмо.

Но в то же время предупреждения "Unknown modifier '@'" исчезли.

Так что что-то не так, но все еще немного неправильно. Просто нужно немного помочь.

Любые предложения или советы?

+2

Не используйте регулярное выражение для проверки электронной почты. Вместо этого используйте 'filter_var()': if (filter_var ($ email, FILTER_VALIDATE_EMAIL)) {// valid email} ' –

+0

Возможный дубликат [PHP с использованием preg \ _replace:« Ошибка разделителя не должна быть буквенно-цифровой или обратной косой чертой ».] (http://stackoverflow.com/questions/2527657/php-using-preg-replace-delimiter-must-not-be-alphanumeric-or-backslash-error) – Toto

ответ

3

Для этого вы можете использовать встроенный PHP filter_var().

function check_email_address($email) { 
    return filter_var($email, FILTER_VALIDATE_EMAIL) ? true : false; 
} 
if(!check_email_address($_POST['email'])) 
    exit("Invalid email address"); 

или просто:

if(!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) 
    exit("Invalid email address"); 
+0

спасибо! увидим, работает ли это. –

+1

работает как очарование! –

+0

С удовольствием :) – Magictallguy

2

«неизвестного Модификатор» проблема, когда вы впервые начали использовать preg_match было связано не с помощью разделителей. Функции preg_ * в PHP ищут разделитель (обычно /), чтобы запустить и закончить регулярное выражение. Разделитель - это то, что вы используете в качестве первого символа. В preg_match("^[^@]{1,64}@[^@]{1,255}$", $email) разделитель равен ^, поэтому регулярное выражение - это все между двумя первыми ^ s. Это означает, что после второго ^, включая @, рассматривается как модификатор. Вот почему добавили косые черты.

Ваш измененный код отклоняет действительные сообщения, так как ушел из ! в вашем if заявлении:

if (!preg_match('/^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i', $email); 

Как другие указывают на то, filter_var($email, FILTER_VALIDATE_EMAIL) является более простым, менее подвержен ошибкам способ фильтрации адресов электронной почты, в любом случае ,

+0

собираюсь попробовать это сейчас. благодаря! –

+0

Небольшая коррекция: 'ereg()' не использует разделители, но кто заботится, поскольку он устарел? – HamZa

+1

@HamZa Хорошая точка.Ошибка OP, отправленная с использованием preg_match, но я забыл исправить это в фрагменте кода OP, который я скопировал и вставил. –