PHP preg_replace () шаблон, санация строк - PullRequest
1 голос
/ 06 февраля 2011

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

Я не гуру регулярных выражений, так чего мне не хватает в регулярных выражениях?

<?php

$pattern = "/^([\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+\.)*[\w\!\#$\%\&\'\*\+\-\/\=\?\^\`{\|\}\~]+@((((([a-z0-9]{1}[a-z0-9\-]{0,62}[a-z0-9]{1})|[a-z])\.)+[a-z]{2,6})|(\d{1,3}\.){3}\d{1,3}(\:\d{1,5})?)$/i";

$email = 'contact<>@domain.com'; // wrong email

$sanitized_email = preg_replace($pattern, NULL, $email);

echo $sanitized_email; // Should be contact@domain.com

?>

Шаблон взят из: http://fightingforalostcause.net/misc/2006/compare-email-regex.php (самый первый ...)

Ответы [ 2 ]

5 голосов
/ 06 февраля 2011

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

$email = preg_replace($filter, "", $email);
if (preg_match($verify, $email)) {
     // ok, sanitized
     return $email;
}

В первом случае вы хотите использовать отрицательный класс символов /[^allowedchars]/.
Для второй части вы используете структуру /^...@...$/.

Посмотрите на расширение фильтра PHPs.Он использует const unsigned char allowed_list[] = LOWALPHA HIALPHA DIGIT "!#$%&'*+-=?^_\ {|} ~ @. [] ";` Для чистки.

И есть монстр для проверки: строка 525 в http://gcov.php.net/PHP_5_3/lcov_html/filter/logical_filters.c.gcov.php - но проверьте http://www.regular -expressions.info / email.html для более распространенного и более короткого варианта.

4 голосов
/ 15 февраля 2011

Я полагаю, что php-функция filter_var может сделать эту функцию более понятным способом. Посмотри на: http://www.php.net/manual/en/function.filter-var.php

пример:

 $email = "chris@exam\\ple.com";
 $cleanEmail = filter_var($email, FILTER_SANITIZE_EMAIL);  // chris@example.com
...