我修改了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');
}
答案 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
。