【问题标题】:Regex to replace non GSM-7 characters正则表达式替换非 GSM-7 字符
【发布时间】: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


【解决方案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'; // 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');
}

这个网站确实有助于调试正则表达式:

http://regex101.com

您还需要更改您的 if-else 以在存在 匹配时继续使用 preg_replace

【讨论】:

  • if-else 只是一个测试用例。这看起来工作得很好,谢谢!看起来我的版本在尝试匹配其中一些角色时非常讨厌。感谢您的帮助!
  • 缺少 \u00A4 字符?
猜你喜欢
  • 2011-02-03
  • 2020-03-30
  • 1970-01-01
  • 2018-07-13
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多