X、y、z 都是数字。除了知道如何检查字符串是否为 14 个字符长之外,我不想迭代每个字符并检查字符是否匹配 [0-9]。
有更聪明的方法吗?没有正则表达式请......我害怕它。
你不必害怕正则表达式。正则表达式只是以下内容的集合:
例如,符号\d
匹配数字集中的任何字符 ( 0-9
)。操作符{n}
指示之前符号n
时间的重复。
有了这些知识,让我们试着用短语来定义你的问题:
第 1 部分:匹配一个加号,后跟 3 位数字
翻译成正则表达式,这是:\+\d{3}
第 2 部分:匹配连字符,后跟 4 位数字
翻译成正则表达式,这是:-\d{4}
第 3 部分:匹配另一个连字符,后跟 4 个数字
翻译成正则表达式,这是:-\d{4}
共
把它们放在一起,你有:
\+\d{3}-\d{4}-\d{4}
您可以使用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 的情况更糟。
正则表达式就是答案。
这是模式:
^\+[0-9]{3}-[0-9]{4}-[0-9]{4}$
没有办法查看每个角色。即使是正则表达式也必须这样做(在幕后)。正则表达式也没什么好害怕的。事实上,这实际上相当容易,尤其是在这样的情况下:
$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]”时是否指的是调用,但这是我能想到的“最简单”的方法之一。