如何以这种格式检查字符串:+ xxx-yyyy-zzzz?

时间:2012-11-27 11:45:51

标签: php

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

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

4 个答案:

答案 0 :(得分:1)

你不需要害怕regexen。正则表达式只是一个集合:

  1. 可用于表示任何一组字符的符号,
  2. 指示如何对这些符号进行分组的运算符。
  3. 例如,符号\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(),但这是“最简单”的方法之一我能想到的