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

时间:2015-04-02 13:16:27

标签: php regex

使用

\/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中使用,因此整个匹配将传递给提供的回调。这就是为什么我想尽可能干净地传递它。

3 个答案:

答案 0 :(得分:1)

是的,可以使用前瞻性正则表达式来避免匹配完整的字符串,例如:

~(?=/Date\((\d{10})(\d{3})([+-]\d{4})?\)/)~

RegEx Demo


<强>代码:

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
)

答案 1 :(得分:1)

不,只是改变表达式是不可能的。 原因是,正如PHP文档所说:

  

$matches[0]将包含与完整模式匹配的文字

答案 2 :(得分:0)

您可以使用此模式:

$pattern = '~/Date\(\K\d{10}(?=(\d{3})([-+]\d{4})\)/)~';

\K从匹配结果中删除左侧的所有内容。 (?=..)是一个前瞻,不是匹配结果的一部分(它的零宽度断言)

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