我正在尝试用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
,但它没有帮助。
怎么了?
答案 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;