奇怪的正则表达式问题

时间:2012-01-15 13:21:37

标签: php regex

我想我可能在这里忽略了一些东西,但我不确定为什么会发生这种奇怪的行为。

我知道这是一个荒谬的正则表达式捕获,但我的问题是为什么会发生这种情况。

<?php
// < 15 "a" characters returns "aaaaaaaaaaaaaa {" (no matches)
$code = 'aaaaaaaaaaaaaa {';
// 15 "a" characters returns NULL
$code = 'aaaaaaaaaaaaaaa {';

$code = preg_replace('#(a+)+\{#', 'b', $code);
var_dump($code);
?>

我意识到正则表达式缺少\s。如果我将正则表达式更改为#(a+)+\s\{#,我会"b"。但是为什么我不能使用15个“a”字符而不是"aaaaaaaaaaaaaaa {"来获取NULL?手册指出发生错误时返回NULL,但PHP没有打印出任何内容(错误检查已打开)。

修改

我使用(a+)+的原因是因为我试图将问题简化到基本级别。我从这开始:

我想捕获一系列非空白字符,后跟空格后跟一个左括号。

this is some text {

所以我使用了正则表达式:

#([^\s\{\}]+\s*)+\{#msi

其中也使用了double +。有没有更好的方法,为什么这首先导致问题?

编辑2 : 从下面的答案看来,双+导致了很多反向引用,应该避免。我选择了[^\s\{\}][^\{\}]*+\{

1 个答案:

答案 0 :(得分:3)

<?php

ini_set('pcre.backtrack_limit',20000);
$code = 'aaaaaaaaaaaaaaa {';
$code = preg_replace('#(a+)+\{#', 'b', $code);
var_dump($code, preg_last_error());

ini_set('pcre.backtrack_limit',1000000);
$code = 'aaaaaaaaaaaaaaa {';
$code = preg_replace('#(a+)+\{#', 'b', $code);
var_dump($code, preg_last_error());

结果:

NULL
int(2)
string(17) "aaaaaaaaaaaaaaa {"
int(0)

但你真的应该使用(a+)(a)+,而不是两者的组合。