【发布时间】:2014-07-02 17:51:28
【问题描述】:
我正在从 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');
}
【问题讨论】:
-
preg_replace替换匹配的内容。如果它不匹配任何东西,它不会替换任何东西。 -
@S.Ahn 我明白 - 但是 preg_match 返回 0,表示
preg意识到有非 GSM 字符。 preg_replace 应该找到那些并用空字符串替换它们。 -
preg_match会在你告诉它寻找它们时找到它们,但你不是。同样,来自文档:“如果找到匹配项,则将返回新主题,否则主题将保持不变,如果发生错误,则返回 NULL。” -
@S.Ahn 由于字符串实际上包含不在
$gsmchars中的字符,并且preg_replace与它们不匹配,所以我的正则表达式中缺少什么?这是我的问题:) -
@S.Ahn 查看我的编辑。我使正则表达式更简单,preg_replace 仍然不会替换不在
$gsmchars中的字符。我错过了一些东西。
标签: php regex preg-replace