-6

X、y、z 都是数字。除了知道如何检查字符串是否为 14 个字符长之外,我不想迭代每个字符并检查字符是否匹配 [0-9]。

有更聪明的方法吗?没有正则表达式请......我害怕它。

4

4 回答 4

1

你不必害怕正则表达式。正则表达式只是以下内容的集合:

  1. 可用于表示任何一组字符的符号,以及
  2. 指示如何对这些符号进行分组的运算符。

例如,符号\d匹配数字集中的任何字符 ( 0-9)。操作符{n}指示之前符号n时间的重复。

有了这些知识,让我们试着用短语来定义你的问题:

第 1 部分:匹配一个加号,后跟 3 位数字

翻译成正则表达式,这是:\+\d{3}


第 2 部分:匹配连字符,后跟 4 位数字

翻译成正则表达式,这是:-\d{4}


第 3 部分:匹配另一个连字符,后跟 4 个数字

翻译成正则表达式,这是:-\d{4}


把它们放在一起,你有:

\+\d{3}-\d{4}-\d{4}

于 2012-11-27T11:51:52.500 回答
1

您可以使用sscanf

例子:

print_r( sscanf("+123-1234-1234", "+%3d-%4d-%4d") );

将输出:

Array ( [0] => 123 [1] => 1234 [2] => 1234 )

但是,这并不能保证输入字符串的有效性。像 +1-1-1 这样的字符串将导致数组的所有三个值都为 1。因此您仍然必须分别验证三个数组值。

查看支持的格式列表(虽然不确定 PHP 是否支持所有这些格式)。

但说真的,^\+\d{3}-\d{4}-\d{4}$这不是什么可怕的事情。这相当简单。Regex Land 的情况更糟。

于 2012-11-27T11:55:37.293 回答
0

正则表达式就是答案。
这是模式:

^\+[0-9]{3}-[0-9]{4}-[0-9]{4}$
于 2012-11-27T11:51:25.710 回答
0

没有办法查看每个角色。即使是正则表达式也必须这样做(在幕后)。正则表达式也没什么好害怕的。事实上,这实际上相当容易,尤其是在这样的情况下:

$ok = preg_match('/^\+\d{3}-\d{4}-\d{4}$/', $text);

至于实际的正则表达式:

  • /在这里用作分隔符,在您想要添加修饰符(如不区分大小写)之前,它们并不重要。
  • ^匹配文本(或行;取决于标志)的开头。
  • \+是一个+字符。转义很重要,因为+这意味着“至少一次匹配前一个表达式”。
  • \d表示任意数字(一个字符)。
  • {n}要求前面的表达式(这里\d:)准确地重复n次数。
  • $匹配文本(或行;取决于标志)的结尾。

它看起来有点复杂,进行经典比较可能会快一点:

$ok = strlen($text) == 14 && ($text[0] == '+') && is_numeric($text[1]) && is_numeric($text[2]) && ...

我不确定您is_numeric()在谈论“检查字符是否匹配 [0-9]”时是否指的是调用,但这是我能想到的“最简单”的方法之一。

于 2012-11-27T11:55:22.620 回答