PHP preg_replace()模式,字符串清理

Ota*_*tar 1 php regex sanitization preg-replace

我有一个正则表达式的电子邮件模式,并希望从字符串中删除所有但模式匹配的字符,简而言之我想要清理字符串...

我不是正则表达式大师,所以我在正则表达式中缺少什么?

<?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

?>
Run Code Online (Sandbox Code Playgroud)

模式取自:http://fightingforalostcause.net/misc/2006/compare-email-regex.php(第一个...)

mar*_*rio 5

您无法同时过滤和匹配.您需要将其分解为用于剥离无效字符的字符类和用于验证有效地址的匹配正则表达式.

$email = preg_replace($filter, "", $email);
if (preg_match($verify, $email)) {
     // ok, sanitized
     return $email;
}
Run Code Online (Sandbox Code Playgroud)

对于第一种情况,您希望使用否定的字符类/[^allowedchars]/.
对于第二部分,您使用结构/^...@...$/.

看看PHPs过滤器扩展.它使用const unsigned char allowed_list[] = LOWALPHA HIALPHA DIGIT "!#$%&'*+-=?^_\{|}〜@.[]";`进行清理.

还有验证的怪物:http ://gcov.php.net/PHP_5_3/lcov_html/filter/logical_filters.c.gcov.php中的第525行- 但请查看http://www.regular-expressions.info/ email.html用于更常见和更短的变体.