Php 如何检查此格式的字符串:+xxx yyy zzzz?
十、 y,z都是数字。除了知道如何检查字符串是否有14个字符长之外,我不想迭代每个字符并检查字符是否匹配[0-9]Php 如何检查此格式的字符串:+xxx yyy zzzz?,php,Php,十、 y,z都是数字。除了知道如何检查字符串是否有14个字符长之外,我不想迭代每个字符并检查字符是否匹配[0-9] 有更聪明的方法吗?没有正则表达式请。。。。我很害怕。正则表达式就是答案。 模式如下: ^\+[0-9]{3}-[0-9]{4}-[0-9]{4}$ 你不必害怕regexen。正则表达式只是以下内容的集合: 可用于指示一组字符中任何一个的符号,以及 指示如何对这些符号进行分组的运算符。 例如,符号\d与数字0-9集合中的任何字符匹配。运算符{n}表示前一个符号重复n次 有了这些知识
有更聪明的方法吗?没有正则表达式请。。。。我很害怕。正则表达式就是答案。 模式如下:
^\+[0-9]{3}-[0-9]{4}-[0-9]{4}$
你不必害怕regexen。正则表达式只是以下内容的集合: 可用于指示一组字符中任何一个的符号,以及 指示如何对这些符号进行分组的运算符。 例如,符号\d与数字0-9集合中的任何字符匹配。运算符{n}表示前一个符号重复n次 有了这些知识,让我们试着用短语来定义您的问题: 第1部分:匹配一个加号,后跟3位数字 翻译成正则表达式,这是:\+\d{3} 第2部分:匹配连字符,后跟4位数字 翻译成正则表达式,这是:-\d{4} 第3部分:匹配另一个连字符,后跟4个以上的数字 翻译成正则表达式,这是:-\d{4} 总共 总而言之,您有:
\+\d{3}-\d{4}-\d{4}没有办法查看每个字符。即使是正则表达式也必须在幕后进行。正则表达式也没什么可怕的。事实上,这其实相当容易,特别是在这样的情况下:
$ok = preg_match('/^\+\d{3}-\d{4}-\d{4}$/', $text);
对于实际正则表达式:
/它们在这里用作分隔符,除非您想添加不区分大小写之类的修饰符,否则它们并不重要。
^匹配文本或行的开头;取决于旗帜。
\+是一个+字符。转义很重要,因为+表示至少与前面的表达式匹配一次。
\d表示任何数字1字符。
{n} 需要前面的表达式:\d重复n次。
$匹配文本或行的结尾;取决于旗帜。
它看起来有点复杂,做经典比较可能会快一点:
$ok = strlen($text) == 14 && ($text[0] == '+') && is_numeric($text[1]) && is_numeric($text[2]) && ...
我不确定在谈到检查字符是否匹配[0-9]时,您是否指调用是数字,但这是我能想到的最简单的方法之一。您可以使用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的情况更糟。我害怕有不必要限制的问题:第1部分不是他想要的+1先生,没什么要说的了我想你想用a$而不是a&作为结尾当通过+1-2-3时,您的解决方案仍然有效,因此您必须检查数组中的长度是否匹配。也考虑这样一个事实,即通过像11111-2-3这样的东西将返回数组111,.@马里奥,这就是为什么我说OP应该检查ArayaAy,认为你只指数组长度。