繁体   English   中英

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

[英]PHP preg_replace() pattern, string sanitization

我有一个正则表达式电子邮件模式,想从字符串中删除除模式匹配字符外的所有字符,总之我要清理字符串...

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

<?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 (第一个...)

您不能同时过滤和匹配。 您需要将其分解为用于清除无效字符的字符类和用于验证有效地址的匹配正则表达式。

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

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

看看PHP过滤器扩展。 它使用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是更常见和更短的变体。

我猜想filter_var php函数也可以做到这一点,而且方式更简洁。 看看: 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM