PHP preg_replace使用下划线字符时返回0值


php preg_replace returns 0 value when using underscore character

我的问题是,为什么'_'(下划线)字符的位置导致这个问题?

我继承了一个脚本,在函数中使用php的preg_replace。所使用的正则表达式对使用它的任何数字返回0。

function foo($number){ 
  $number = preg_replace('/[a-z$,-_]/i','',$number);
  // more code...
}

我做了一些调试,发现问题出在preg_replace()上。一位同事提到,可能是正则表达式中字符的顺序导致了这个bug。所以,我摆弄了一下,发现这是真的。"_"(下划线)字符的位置是罪魁祸首。我把它改成:

'/[a-z$_,-]/i'

…一切都很好。

那么,问题是,为什么'_'(下划线)字符的位置会导致这个问题?我在谷歌上搜索了一下,但没有找到,我想这个论坛里的人可能有答案。

谢谢你的启发!jc

这是连字符的位置,而不是下划线。使用[a-z$,-_],您无意中创建了从,_的字符范围。将连字符放在末尾或转义。

逗号,是ASCII 0x2C,下划线_是0x5F,数字介于两者之间(0x30到0x39)。

有些字符需要像这样转义

[a-z,'-_]