正则表达式替换非GSM-7字符

时间:2014-07-02 17:51:28

标签: php regex preg-replace

我修改了SO answer的GSM-7集 - 它是为Javascript编写的,但我正在修改它以使用preg

我添加了分隔符~converted the \u to \x{XXXX},并在最后添加了u。我还在左括号^之后添加了[,因此preg_replace将替换任何非空白的GSM-7字符。

我的问题是preg_match正确返回false,但preg_replace不替换任何内容。

我错过了什么?我已经尝试在~之后和之前添加括号,但这似乎没有做任何事情。

下面的代码只显示乱码文本,而不是preg_replace用空格替换乱码部分。

编辑我还尝试了$gsmchars = '~^[^A-Za-z0-9]*$~u';,其中preg_replace做同样的事情 - 没有。我的正则表达式中缺少什么选项?

$gsmchars = '~^[^A-Za-z0-9 \\r\\n@£$¥èéùìòÇØøÅå\x{0394}_\x{03A6}\x{0393}\x{039B}\x{03A9}\x{03A0}\x{03A8}\x{03A3}\x{0398}\x{039E}ÆæßÉ!\"#$%&\'\(\)*+,\\-./:;<=>?¡ÄÖÑܧ¿äöñüà^{}\\\\\\[\~\\]|\x{20AC}]*$~u';

$string = 'ab€m²cdefلg123$';

$match = preg_match($gsmchars, $string);

if ($match === false) {
    die("ERROR");
} else if (!$match) {
    $replace = preg_replace($gsmchars, '', $string);
    //Now that it's in UTF-8, replace the non-GSM chars
    die($replace . "A");    
} else {
    die('match');
}

1 个答案:

答案 0 :(得分:1)

试试这个:

$gsmchars = '~[^A-Za-z0-9 \r\n@£$¥èéùìòÇØøÅå\x{0394}_\x{03A6}\x{0393}\x{039B}\x{03A9}\x{03A0}\x{03A8}\x{03A3}\x{0398}\x{039E}ÆæßÉ!\"#$%&\'\(\)*+,\-.\/:;<=>;?¡ÄÖÑܧ¿äöñüà^{}\[\~\]\|\x{20AC}]~u';
$string = 'ab€m²cdefلg123$';
echo preg_replace($gsmchars, '', $string);

$match = preg_match($gsmchars, $string);

if ($match === false) {
    die("ERROR");
} else if ($match) {
    $replace = preg_replace($gsmchars, '', $string);
    //Now that it's in UTF-8, replace the non-GSM chars
    die($replace . "A");    
} else {
    die('match');
}

这个网站真的有助于调试正则表达式:

http://regex101.com

匹配时,您还需要更改if-else以继续preg_replace