【问题标题】:RegEx Issue: Preg_Match Only 2 non consecutive spaces, no special characters [PHP]正则表达式问题: Preg_Match 只有 2 个非连续空格,没有特殊字符 [PHP]
【发布时间】:2015-10-22 15:02:21
【问题描述】:

因此,对于我的班级,我们正在模拟某人将名字、中间名和姓氏输入到表单中。我有一个变量$fullname 将它们连接起来并拉出中间的首字母以及strtolowerucfirst...

所以rObERT jAmES smITH 然后被解析为Robert J Smith

现在如果有人输入R!bert J Smith(注意特殊字符“!”),它会被接受。为了解决这个问题,我用pregmatch 做了一个If/else 声明。

if (preg_match("/[^a-z\s]/i",$fullname)) {
        echo ("<span class = 'warning'>Invalid User Name!</span>"."<br>"
                ."Please use only characters A-Z for your name."."<br>");
        exit; 
    }
    else {                   
        echo ("User Name: ".$fullname."<br>"); 
    } 

这基本上是说如果除了字母和空格之外还有其他内容,请抛出我的回显消息。

如果有人要输入R obert J Smith,现在我遇到了问题。 (注意Ro 之间的空格字符)。因为我允许空格,所以它说没关系。这会在以后弄乱我所有的“create username and password”功能。

TLDR:我要问的是什么将允许预匹配仅匹配或不匹配 2 个不连续的空格和字符 A-Z/i

注意:我尝试了各种版本的\s {2},但这是针对连续空格,而不是非连续空格。

PS:永远只有 2 个空格。我在将输入解析为 $fullname 之前对其进行修剪。

我已经尝试了 3 个小时,但挫败感阻碍了我在不同方向上解决这个问题的能力。

谢谢你, 爱笑的人

【问题讨论】:

  • 计算空格字符的个数。检查非字母数字字符(如!,但可能允许'`?)。还有像 Armin van BuurenRobert McPhearson 这样的名字呢?
  • 要匹配 2 个不连续的空格,您可以使用 '/\s\S+\s/' regex。
  • 比这更复杂。如果名称是Robert James Van Winkle III 怎么办? Dr. Robert Van Winkle James, Jr. 呢?您得到的答案会对您有所帮助,但您需要考虑边缘情况。 (注意:我知道您的作业可能仅限于简单的案例,因此请考虑针对实际案例的建议,而不一定针对您的班级。)
  • 谢谢 Ed,我确实考虑过这一点,但作业的要求只需要一个标准的 FN 中间首字母 LN。

标签: php regex


【解决方案1】:

可以用正则表达式:

/^\w+(\s\w+){0,2}$/

匹配 1、2 或 3 个空格分隔的单词,或者使用它来始终匹配 3:

/^\w+\s\w+\s\w+$/

但您也可以将检查无效字符 (/[^\w]/) 与检查输入的字数分开:

if ( count( explode(' ', $fullname) ) != 3 )

【讨论】:

  • 谢谢!我最初使用 /^\w+\s\w+\s\w+$/ 然后最终用 [a-z] 和 /i 替换 \w
  • 不客气!顺便说一句,我会研究 Ed Cotrell 所说的 - 检测中间名并不像看起来那么简单;唯一可以确定的方法是有多个输入字段(fname、lname、middle names、title 等...)。此外,已婚妇女通常会附加连字符和娘家姓。它几乎和地址一样复杂,最好将用户输入的内容原样反馈给用户。
【解决方案2】:

您可以使用此正则表达式匹配您的全名,这将只允许 1 或 2 个空格:

'/^\p{L}+(?:\h\p{L}+){1,2}$/u'

RegEx Demo

\p{L} 匹配任何 unicode 字母,/u 支持正则表达式中的 unicode。

【讨论】:

  • 谢谢!这超出了我的范围,我很欣赏这个链接,我会尝试进一步理解它注意:对于我们的教授告诉我们的作业,我们不需要担心额外的字符,所以现在我知道将来如何包含所有 unicode 字母,谢谢 :)
  • 我真的很惊讶你删除了接受标记。您标记的答案还将验证 123 或仅将 _ 作为有效名称。顺便说一句,如果有什么不清楚的,请随时提问。我提供的演示链接包含我使用的正则表达式的所有详细信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2017-08-18
  • 2012-10-03
相关资源
最近更新 更多