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

Php 正则表达式替换非GSM-7字符,php,regex,preg-replace,Php,Regex,Preg Replace,我正在修改GSM-7设置,它是为Javascript编写的,但我正在修改它以使用preg 我添加了一个分隔符~,并在末尾添加了u。我还在开头的括号后添加了^,[,以便将任何非GSM-7字符替换为空白字符 我的问题是正确地返回false,但preg_replace并没有替换任何内容 我遗漏了什么?我尝试在~之后和之前添加括号,但似乎没有任何效果 下面的代码显示的只是乱码文本,而不是被preg_replace替换为空白的乱码部分 编辑:我也尝试了$gsmchars='~^[^A-Za-z0-9]*$

我正在修改GSM-7设置,它是为Javascript编写的,但我正在修改它以使用
preg

我添加了一个分隔符
~
,并在末尾添加了
u
。我还在开头的括号后添加了
^
[
,以便将任何非GSM-7字符替换为空白字符

我的问题是正确地返回false,但preg_replace并没有替换任何内容

我遗漏了什么?我尝试在
~
之后和之前添加括号,但似乎没有任何效果

下面的代码显示的只是乱码文本,而不是被preg_replace替换为空白的乱码部分

编辑:我也尝试了
$gsmchars='~^[^A-Za-z0-9]*$$u';
哪个preg\u 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');
}
试试这个:

$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'; // added backslash

$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');
}

您还需要更改
if else
以在有匹配项时继续执行
preg\u replace

preg\u replace
替换匹配项。如果它不匹配任何项,则不会替换任何项。@S.Ahn我理解-但preg\u match返回0,表示那里有
preg
是非GSM字符。preg_replace应找到这些字符,并将其替换为空字符串。
preg_match
会找到它们,如果您告诉它查找它们,但您没有。同样,从文档中:“如果找到匹配项,将返回新的主题,否则主题将原封不动地返回,如果发生错误,则返回NULL。”。"@S.Ahn由于字符串实际上包含不在
$gsmchars
中的字符,并且
preg\u replace
与它们不匹配,我的正则表达式中缺少什么?这是我的问题:)@S.Ahn请参见我的编辑。我简化了正则表达式,preg\u replace仍然不会替换不在
$gsmchars
中的字符。我缺少something.
if-else
只是一个测试用例。看起来它工作得很好,谢谢!看起来我的版本在试图匹配其中一些字符时非常糟糕。我感谢您的帮助!是否缺少\u00A4字符?
http://regex101.com