Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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中简单正则表达式的问题_Php_Regex - Fatal编程技术网

PHP中简单正则表达式的问题

PHP中简单正则表达式的问题,php,regex,Php,Regex,解释我的问题最好的方法就是让你看看 输入字符串: /04-11-2010/12:45/ preg_match('@/(\d\d)-(\d\d)-(\d\d\d\d)/(\d\d):(\d\d)/@', $input, $matches); Array ( [0] => /01-11-2010/12:45/ [1] => 01 [2] => 11 [3] => 2010 [4] => 12 [5] => 45

解释我的问题最好的方法就是让你看看

输入字符串:

/04-11-2010/12:45/
preg_match('@/(\d\d)-(\d\d)-(\d\d\d\d)/(\d\d):(\d\d)/@', $input, $matches);
Array
(
    [0] => /01-11-2010/12:45/
    [1] => 01
    [2] => 11
    [3] => 2010
    [4] => 12
    [5] => 45
)
/04-11-2010//
获取日期和时间部分的正则表达式:

/04-11-2010/12:45/
preg_match('@/(\d\d)-(\d\d)-(\d\d\d\d)/(\d\d):(\d\d)/@', $input, $matches);
Array
(
    [0] => /01-11-2010/12:45/
    [1] => 01
    [2] => 11
    [3] => 2010
    [4] => 12
    [5] => 45
)
/04-11-2010//
PHP匹配数组:

/04-11-2010/12:45/
preg_match('@/(\d\d)-(\d\d)-(\d\d\d\d)/(\d\d):(\d\d)/@', $input, $matches);
Array
(
    [0] => /01-11-2010/12:45/
    [1] => 01
    [2] => 11
    [3] => 2010
    [4] => 12
    [5] => 45
)
/04-11-2010//
现在,上面的正则表达式可以完美地获取表示输入字符串中日期和时间的各个组件部分

问题是,时间部分需要是可选的,而不必关闭整个正则表达式

问题输入字符串:

/04-11-2010/12:45/
preg_match('@/(\d\d)-(\d\d)-(\d\d\d\d)/(\d\d):(\d\d)/@', $input, $matches);
Array
(
    [0] => /01-11-2010/12:45/
    [1] => 01
    [2] => 11
    [3] => 2010
    [4] => 12
    [5] => 45
)
/04-11-2010//
PHP匹配数组

Array
(
)
基本上,matches数组需要返回的是:

Array
(
    [0] => /01-11-2010/12:45/
    [1] => 01
    [2] => 11
    [3] => 2010
    [4] => 
    [5] => 
)

注意数组元素4和5仍然需要存在,但返回为空。

使第二部分成为可选部分:

'@/(\d\d)-(\d\d)-(\d\d\d\d)/(?:(\d\d):(\d\d))?/@'

此处使用了一个无法引用的非捕获组
(?:…)
,因此不会更改匹配组。

使第二部分成为可选部分:

'@/(\d\d)-(\d\d)-(\d\d\d\d)/(?:(\d\d):(\d\d))?/@'

这里使用了一个无法引用的非捕获组
(?:…)
,因此不会更改匹配组。

我不是php负责人,但是:

preg_match('@/(\d\d)-(\d\d)-(\d\d\d\d)/(\d\d)?:?(\d\d)?/@', $input, $matches);

就regexp而言,它应该匹配一个没有时间字段的字符串。

我不是php的负责人,但是:

preg_match('@/(\d\d)-(\d\d)-(\d\d\d\d)/(\d\d)?:?(\d\d)?/@', $input, $matches);

就regexp而言,它应该匹配一个没有时间字段的字符串。

使用问号操作符和非捕获组将内容设置为可选

@/(\d\d)-(\d\d)-(\d\d\d\d)/(?:(\d\d):(\d\d))?/@
我不确定这是如何与匹配数组交互的——如果有空数组元素是绝对关键的,那么您可能需要使用

@/(\d\d)-(\d\d)-(\d\d\d\d)/((?:\d\d)?):?((?:\d\d)?)/@

它有自己的假阳性(此时的冒号是可选的)。

使用问号运算符和非捕获组使内容可选

@/(\d\d)-(\d\d)-(\d\d\d\d)/(?:(\d\d):(\d\d))?/@
我不确定这是如何与匹配数组交互的——如果有空数组元素是绝对关键的,那么您可能需要使用

@/(\d\d)-(\d\d)-(\d\d\d\d)/((?:\d\d)?):?((?:\d\d)?)/@
它有自己的假阳性(当时的冒号现在是可选的)

做您想要的(即填充组4和组5),但也接受不完整的时间,如

    /04-11-2010/12:/
我不知道这对你是否合适

做您想要的(即填充组4和组5),但也接受不完整的时间,如

    /04-11-2010/12:/

不知道这是否适合您

@OP,不需要凌乱的正则表达式

$str="/04-11-2010/12:45/";
$s = array_filter(explode('/',$str));
$date=$s[1];
$time=$s[2];
$date_parts=explode("-",$date);
$time_parts=explode(":",$time);
if ( checkdate($date_parts[1],$date_parts[0],$date_parts[2]) ){
    print "date ok\n";
}

@哦,不需要乱七八糟的正则表达式

$str="/04-11-2010/12:45/";
$s = array_filter(explode('/',$str));
$date=$s[1];
$time=$s[2];
$date_parts=explode("-",$date);
$time_parts=explode(":",$time);
if ( checkdate($date_parts[1],$date_parts[0],$date_parts[2]) ){
    print "date ok\n";
}

使用本机PHP函数执行此任务,使用正则表达式有点过分

PHP 5具有以下功能:

$string = '/04-11-2010/12:45/';
$dateArray = date_parse(str_replace('/', ' ', $string));
print_r($dateArray);

$string = '/04-11-2010//';
$dateArray = date_parse(str_replace('/', ' ', $string));
print_r($dateArray);
输出:

Array
(
    [year] => 2010
    [month] => 11
    [day] => 4
    [hour] => 12
    [minute] => 45
    [second] => 0
    [fraction] => 0
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 
)

Array
(
    [year] => 2010
    [month] => 11
    [day] => 4
    [hour] => 
    [minute] => 
    [second] => 
    [fraction] => 
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 
)

PHP5.3有一个更灵活的函数,您也可以使用。

使用本机PHP函数完成此任务,使用正则表达式有点过分

PHP 5具有以下功能:

$string = '/04-11-2010/12:45/';
$dateArray = date_parse(str_replace('/', ' ', $string));
print_r($dateArray);

$string = '/04-11-2010//';
$dateArray = date_parse(str_replace('/', ' ', $string));
print_r($dateArray);
输出:

Array
(
    [year] => 2010
    [month] => 11
    [day] => 4
    [hour] => 12
    [minute] => 45
    [second] => 0
    [fraction] => 0
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 
)

Array
(
    [year] => 2010
    [month] => 11
    [day] => 4
    [hour] => 
    [minute] => 
    [second] => 
    [fraction] => 
    [warning_count] => 0
    [warnings] => Array
        (
        )

    [error_count] => 0
    [errors] => Array
        (
        )

    [is_localtime] => 
)

PHP 5.3有一个更灵活的功能,您也可以使用。

如果您这样做,第一个(在/之后)将生成一个新的数组条目,不是吗?或者,(?)在/之后是什么?是英语吗?不,不是。这是什么?:does-它使它成为一个非捕获组。这意味着可以使用一个组使它成为可选的(?在本例中)或重复等,但它不会作为返回值的一部分被捕获。如果这样做,第一个(在/之后)将生成一个新的数组条目,不是吗?或者这就是(?在/is for之后?那是英文的吗?不,不会。这就是为什么?:does-它使它成为一个非捕获组。这意味着一个组可以用来使它成为可选的(?如本例所示)或重复的等等。但它不会被捕获为返回值的一部分。我太晚了!来吧,你不需要正则表达式;)@Rowlf事实上,日期的使用只是一个例子。我实际上有一个更大的输入字符串,需要正则表达式来提取所有数据。我需要知道的是如何捕获一个组,即使它不匹配。@Camsoft Fair:)我太晚了!来吧,你不需要正则表达式;)@Rowlf实际上,日期的使用只是一个例子。实际上,我有一个更大的输入字符串,需要一个正则表达式来提取所有数据。我所需要知道的是如何捕获一个组,即使它不匹配。@Camsoft Fair:)好的,那么我们将使用messy PHP来代替它?不要告诉我你不了解它在做什么?好的,那么我们将使用messy PHP来代替它?不要告诉我你不了解它在做什么?谢谢。但是这看起来比简单的正则表达式更像是杀伤力过大。最终,一个好的正则表达式将更加健壮和灵活。谢谢。但是,这是一个很好的正则表达式oks更像是过度杀戮,而不是简单的正则表达式。最终,一个好的正则表达式将更加健壮和灵活。