【问题标题】:regex to filter all but whitelisted characters from a multi-language string正则表达式从多语言字符串中过滤除白名单之外的所有字符
【发布时间】:2025-12-27 16:35:06
【问题描述】:

我正在尝试清理来自多语言网站上的搜索框的字符串。

通常我会使用如下的正则表达式:

$allowed = "-+?!,.;:\w\s";
$txt_search = preg_replace("/[^" . $allowed . "]?(.*?)[^" . $allowed . "]?/iu", "$1", $_GET['txt_search']);

这适用于英文文本。

但是,当输入的文本可以是任何语言(现在是俄语,将来是中文)时,我需要这样做。

如何在保留原始语言的“普通文本”的同时清理字符串?

我想切换到黑名单(虽然我宁愿不...),但此时正则表达式完全破坏了所有原始输入。

【问题讨论】:

    标签: php regex filter multilingual


    【解决方案1】:

    您可以使用 \p{LN} [\p{L}\p{N}] 代替 \w ,请参阅 http://www.php.net/manual/en/regexp.reference.unicode.php

    【讨论】:

    • 谢谢。我在偏移量 5 处不断收到 无效的 UTF-8 字符串。是否有可能 PCRE 没有使用 unicode 属性编译,我可以检查一下吗?目前我只是在 ubuntu 9.10 桌面服务器上进行测试。
    • 我无法让它工作,但我想我会在另一台服务器上尝试它,也许这是一个本地问题。
    【解决方案2】:

    常见的问题是\w模式无法识别俄语字母,所以你可以使用

    $allowed = "-+?!,.;:\w\sа-я";

    【讨论】:

    • 不会 [а-я] 扩展到它们的 UTF-8 数字,所以 [50-60000](数字不准确)?我认为这对于正则表达式来说会很慢?
    • 你可以在字符类中使用字符类吗?这将转化为 [^-+?!,.;:\w\s[а-я]]
    • Jeroen,我可以,但你说得对,没有“子类”,所以它添加了“[”和“]”符号。答案固定:)
    • 嗯,这不起作用,如果我使用它,我会收到警告:“消息:preg_replace() [function.preg-replace]:编译失败:偏移量 5 处的 UTF-8 字符串无效” .
    • 我认为,您保存的文件不是 utf8,而是 cp1251 编码。
    最近更新 更多