Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检查此格式的字符串:+xxx yyy zzzz?_Php - Fatal编程技术网

Php 如何检查此格式的字符串:+xxx yyy zzzz?

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次 有了这些知识

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


有更聪明的方法吗?没有正则表达式请。。。。我很害怕。正则表达式就是答案。 模式如下:

^\+[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,认为你只指数组长度。