php中的Preg Match抑扬符^ - php

我无法完全理解^在我的preg_match中所做的事情。

 if (preg_match('~^(\d\d\d\d)(-(\d{1,2})(-(\d{1,2}))?)?$~', trim($date), $dateParts)) {
   echo the $dateparts and do some magic with them
 } else {
   tell me the date is formatted wrong
 }

正如我所看到的,这是在寻找$ date是否与我读为的格式匹配
4个小数-1或2个小数-1或2个小数

如果匹配,则IF语句显示日期;如果不匹配,则给出错误的日期格式错误。

但是只是过了一年
$ date ='1977',没有其他任何东西(无日或无月),它仍然会作为true并显示日期部分,我会认为它将引发错误?

有人可以指出我在正则表达式中缺少的内容吗?我猜这是^或末尾的?$可能意味着仅匹配其中一部分?

参考方案

无需将所有内容都归为一组。这看起来更好,并且将执行以下操作:

preg_match('~^\d{4}(-\d{1,2}(-\d{1,2})?)?$~', trim($date), $dateParts)

这也解释了为什么接受“ 1977”的原因-月和日部分都是可选的(问号使某些内容可选)。

要执行您说的话(“ 4个小数-1或2个小数-1或2个小数”),您需要删除两个可选组:

preg_match('~^\d{4}-\d{1,2}-\d{1,2}$~', trim($date), $dateParts)

^”和“ $”与您看到的问题无关。它们只是字符串开始和字符串结束锚,请确保所检查的字符串中除了模式所描述的内容之外没有其他内容。保留它们,"blah 1977-01-01 blah"将开始匹配。

preg_match不捕获内容 - php

我的preg_match有什么问题?preg_match('numVar("XYZ-(.*)");',$var,$results); 我想从这里获取所有内容:numVar(“ XYZ-CONTENT”);感谢您的任何帮助! 参考方案 我认为这是PHP?如果是这样,则您的代码存在三个问题。PHP的PCRE函数要求使用分隔…

php:拆分字符串,直到第一次出现数字 - php

我有像cream 100G sup 5mg Children 我想在第一次出现数字之前将其拆分。所以结果应该是array( array('cream','100G'), array('sup','5mg Children') ); 可以告诉我如何为此创建图案吗?我试过了list(…

将大字符串分成多个小字符串-PHP - php

我从数据库中获取了一个长字符串,我需要对其进行解析,以使其不包含一个大字符串,而是多个,其中每个字符串都有2个字符。让我们以示例为例:我连接到表,获取此字符串:B1C1F4G6H4I7J1J8L5O6P2Q1R6T5U8V1Z5,之后,我必须对字符串进行解析,因此:B1 C1 F4 G6 H4 I7 J1 J8 L5 O6 P2 Q1 R6 T5 U8 V1…

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…