PHP-避免preg_match中不必要的匹配


PHP - Avoid unnecessary match in preg_match

使用时

'/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从匹配结果中删除左侧的所有内容。(?=..)是一个前瞻,它不是匹配结果的一部分(它是一个零宽度断言)

这个想法是使用十位数字作为整个匹配结果。