preg_match_callback不匹配(带反向引用的正则表达式)

时间:2015-09-13 08:52:06

标签: php regex

我正在尝试用X{times}替换重复的字符X(如果X不是\*

$mask = "aaaa-dddd";

$mask = preg_replace_callback("/([^\\*])\1+/", function($matches) {

    echo "match!!!"; // never happens

    return $matches[1] . "{" . strlen($matches[0]) . "}";
},  $mask);

echo $mask; // expected: a{4}-d{4}, actual: aaaa-dddd

我非常有信心正则表达式是正确的,但它似乎根本不匹配。

我还尝试使用$1代替\1,但它没有帮助。

怎么了?

1 个答案:

答案 0 :(得分:1)

使用单引号而不是双引号。因为在双引号内,\\将被视为转义序列而不是正则表达式。

$mask = "aaaa-dddd";

$mask = preg_replace_callback('/([^\\*])\1+/', function($matches) {

    echo "match!!!"; // never happens

    return $matches[1] . "{" . strlen($matches[0]) . "}";
},  $mask);

echo $mask;

$mask = preg_replace_callback("/([^\\\\*])\\1+/", function($matches) {

    echo "match!!!"; // never happens

    return $matches[1] . "{" . strlen($matches[0]) . "}";
},  $mask);

echo $mask;