使用时
'/Date'(('d{10})('d{3})(['+'-]'d{4})?')'/
在上
/Date(1425556377427+0100)/
preg_match
的结果是
array(
0 => /Date(1425556377427+0100)/
1 => 1425556377
2 => 427
3 => +0100
)
是否可以更改正则表达式,使其不会将整个字符串作为第一个匹配项进行匹配?
编辑
只是为了澄清(因为这就是-1的来源)。正则表达式用于preg_replace_callback
,因此将整个匹配传递给所提供的回调。这就是为什么我想把它传给那里尽可能干净。
是的,可以使用前瞻正则表达式避免在此处匹配完整字符串,即:
~(?=/Date'(('d{10})('d{3})([+-]'d{4})?')/)~
RegEx演示
代码:
preg_match('~(?=/Date'(('d{10})('d{3})([+-]'d{4})?')/)~',
'/Date(1425556377427+0100)/', $m);
unset($m[0]);
print_r($m);
Array
(
[1] => 1425556377
[2] => 427
[3] => +0100
)
不,仅仅更改表达式是不可能的。原因是,正如PHP文档所说:
$matches[0]
将包含与全模式匹配的文本
您可以使用以下模式:
$pattern = '~/Date'('K'd{10}(?=('d{3})([-+]'d{4})')/)~';
'K
从匹配结果中删除左侧的所有内容。(?=..)
是一个前瞻,它不是匹配结果的一部分(它是一个零宽度断言)
这个想法是使用十位数字作为整个匹配结果。