【问题标题】:What is the correct way of keeping spaces, Latin and Cyrillic characters with preg_replace, in PHP 7.4.*?在 PHP 7.4.* 中使用 preg_replace 保留空格、拉丁文和西里尔字符的正确方法是什么?
【发布时间】:2020-08-15 16:16:15
【问题描述】:

考虑以下内容。

function cleanText($text) {
    return preg_replace("/[^0-9\p{Latin}\p{Cyrillic}\.\-\_\s+]+/u","",$text);
}
$tmp = "intro_|_text  Mary had a little lamb, we'll be right back   123456789  абвгдђежзијкл     ,./'*     αβγδε    šđ";
echo cleanText($tmp);

预期的输出是(在 phpfiddle.org 和 repl.it 上都可以看到):

intro__text Mary had a little lamb well be right back 123456789 абвгдђежзијкл . šđ

但是,带有 PHP 7.4.8 的 Xampp 和 this site 返回以下内容(后者带有每个 PHP 7.4.*):

aMaryhadalittlelambwellberightback123456789абнллклл.šđ

如果删除\p{Latin}\p{Cyrillic},则保留空格。在preg_replace 中同时包含单个空格和特定字母的正确方法是什么?

【问题讨论】:

  • 由于某些原因,这些属性不受支持,您可以使用\p{L} 匹配任何字母,使用preg_replace('/[^0-9\\p{L}\\s._+-]+/u', '', $text)
  • @WiktorStribiżew 使用\p{L} 时有什么注意事项吗?也就是说,是否有任何特殊情况可能会失败或出现意外行为?
  • 它只匹配任何字母。如果您不在乎它是亚美尼亚字母、西里尔字母还是希伯来字母,那么您可以使用它。
  • 这似乎有效。谢谢。

标签: regex php-7.4


【解决方案1】:

您可以使用 \p{L} 代替 Unicode 属性,它的支持似乎在这里被破坏了。

你可以使用

preg_replace('/[^0-9\\p{L}\\s._+-]+/u', '', $text)

还要注意在字符类末尾使用-比较安全,以免逃逸。 ._ 也不需要转义,_ 是一个字符,. 在字符类中失去了它的特殊含义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多