X,y,z都是数字。除了知道如何检查字符串是否为14个字符长之外,我不想迭代每个字符并检查字符是否匹配[0-9]。
有更聪明的方法吗?没有正则表达式......我很害怕它。
答案 0 :(得分:1)
你不需要害怕regexen。正则表达式只是一个集合:
例如,符号\d
匹配数字集合中的任何字符(0-9
)。运算符{n}
表示重复前一个符号n
次。
有了这些知识,让我们尝试用短语来定义你的问题:
第1部分:匹配加号,后跟3位
转换为正则表达式,这是:\+\d{3}
第2部分:匹配连字符,后跟4位
转换为正则表达式,这是:-\d{4}
第3部分:匹配另一个连字符,然后再输入4个数字
转换为正则表达式,这是:-\d{4}
<强>共强>
总而言之,你有:
\+\d{3}-\d{4}-\d{4}
答案 1 :(得分:1)
您可以使用sscanf
:
示例:
print_r( sscanf("+123-1234-1234", "+%3d-%4d-%4d") );
将输出:
Array ( [0] => 123 [1] => 1234 [2] => 1234 )
但这并不能保证输入字符串的有效性。像+ 1-1-1之类的字符串会导致数组中的所有三个值都为1.因此,您仍需要分别验证三个数组值。
请参阅the list of supported formats(不确定PHP是否支持所有这些)。
但严重的是,^\+\d{3}-\d{4}-\d{4}$
并不值得害怕。这很简单。 Regex Land的情况要糟糕得多。
答案 2 :(得分:0)
正则表达式就是答案 这是模式:
^\+[0-9]{3}-[0-9]{4}-[0-9]{4}$
答案 3 :(得分: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]) && ...
我不确定你在谈到“检查字符是否匹配[0-9]”时是否提到调用is_numeric()
,但这是“最简单”的方法之一我能想到的