PHP和正则表达式问题?

时间:2010-03-18 04:12:12

标签: php regex

我想知道下面的代码是否是使用正则表达式使用preg_match检查街道地址,电子邮件地址,密码,城市和网址的正确方法?

如果没有,我应该如何修复preg_match代码?

 preg_match ('/^[A-Z0-9 \'.-]{1,255}$/i', $trimmed['address']) //street address
 preg_match ('/^[\w.-]+@[\w.-]+\.[A-Za-z]{2,6}$/', $trimmed['email'] //email address
 preg_match ('/^\w{4,20}$/', $trimmed['password']) //password
 preg_match ('/^[A-Z \'.-]{1,255}$/i', $trimmed['city']) //city
 preg_match("/^[a-zA-Z]+[:\/\/]+[A-Za-z0-9\-_]+\\.+[A-Za-z0-9\.\/%&=\?\-_]+$/i", $trimmed['url']) //url

4 个答案:

答案 0 :(得分:1)

您的街道地址:^[A-Z0-9 \'.-]{1,255}$

  • 你无需逃避单引号。
  • 因为你在char中有一个dot class,它将允许所有char(除了 新队)。如此有效的正则表达式变为^.{1,255}$
  • 你允许它是最小的 长度为1,最大长度为255 建议你增加分钟 长度超过1。

您的电子邮件正则表达式:^[\w.-]+@[\w.-]+\.[A-Za-z]{2,6}$

  • 你再次在char中拥有. 类。解决这个问题。

您的密码正则表达式:^\w{4,20}$

  • 允许长度为4到20的passwd 并且只能包含字母(上部 和更低),数字和下划线。我建议你允许 特别的char也是...让你的 密码更强。

您的城市正则表达式:^[A-Z \'.-]{1,255}$

  • 在char类中有.
  • 允许最小长度为1(如果你愿意的话) 允许1个字符长度的城市 很好)。

修改

由于您对正则表达式不熟悉,请花些时间在Regular-Expressions.info

答案 1 :(得分:1)

这对我来说似乎过于复杂。特别是我可以看到一些不起作用的东西:

  1. 对于名称中包含非ASCII字母的城市,例如“Malmö”或서울等,您的正则表达式将失败。
  2. 您的密码验证器不允许密码中的空格(这对于输入密码短语非常有用),它甚至不允许使用数字或标点符号,许多人都希望将其放入密码中以增加安全性。< / LI>
  3. 您的地址验证员不允许居住在公寓(12/345 Foo St)
  4. 的人

    (假设你的意思是“\。”而不是“。”,因为“。”匹配任何东西)

    等等。一般来说,我认为过度依赖正则表达式进行验证并不是一件好事。你可能最好不要为这些领域提供任何东西,只是以其他方式验证它们。

    例如,使用电子邮件地址:仅仅因为根据RFC标准地址有效并不意味着您实际上可以向其发送电子邮件(或者它是正确的电子邮件该人的地址)。验证电子邮件地址的唯一可靠方法是实际向其发送电子邮件,并让此人点击链接或其他内容。

    与URL相同:只是因为它根据标准有效并不意味着那里有一个网页。您可以通过尝试执行获取页面的实际请求来验证URL。

    但我个人的偏好是尽可能地进行绝对最低限度的验证,并留待它。让人们编辑他们的个人资料(或者你正在验证的任何东西),以防他们犯错误。

答案 2 :(得分:0)

检查这些东西并不是一种“正确”的方法。这取决于您的要求是什么。

对于电子邮件地址和网址,我建议您使用filter_var而不是正则表达式 - 只需将其传递给FILTER_VALIDATE_EMAILFILTER_VALIDATE_URL

使用其他正则表达式,您需要确保逃脱。在字符类中(否则它将允许所有内容),您可能想要考虑City / Street允许垃圾,例如''''',或只是空格。

答案 3 :(得分:0)

请不要假设您知道地址是如何组成的。有成千上万的城市,乡镇和村庄,其中包括&amp;以及来自其他字母的那些。

除非您通过特定于某个国家/地区的API执行此操作,否则请勿尝试验证地址(例如,美国的USPS)。

为什么要限制用户密码中的字符?除了现有密码之外,对密码没有任何要求。

如果您使用这些正则表达式,您的网站将无法使用。