preg_match忽略允许的字符

时间:2014-07-01 15:19:27

标签: php regex

我有以下utf8编码的来源:

  1. PHP脚本
  2. MySQL数据库连接
  3. MySQL表格和字段
  4. HTML文件
  5. 为什么是以下代码:

    preg_match("@^[0-9A-ZĄąĆćĘꣳÓ󯿏źŃńŚś\-\.\, ]{3,35}$@i", $valuesId)
    

    允许像płatność,nieudana proba这样的单词和表达但不允许简单表达nieudanapróba?对于preg_match不想传递的Ó,ó字符似乎存在问题。我可以继续说ćoba或rćoba这样的词,但próba不起作用。

    如果与ł,ś和ć一起被允许,为什么会这样呢?

1 个答案:

答案 0 :(得分:0)

TL; DR MySQL utf8编码命名错误。


我测试了你的代码,它与你给出的所有表达式相匹配。 Demo。我强烈怀疑你有MySQL的编码问题。

最好的选择:您确实需要强制MySQL使用utf8mb4编码,而不是utf8编码。有关此问题的完整解释和教程可供in this post by Mathias Bynens使用。要点:

  • 在执行任何其他操作之前备份您的数据库!
  • 您需要为每个数据库,每个表和每个数据库设置CHARACTER SETutf8mb4COLLATEutf8mb4_unicode_ci来修改数据库,表格和文本列文本栏。
  • utf8mb4每个字符使用额外的字节,因此您可能需要更改列和索引键的最大长度。
  • 将所有连接,客户端和服务器字符集从utf8更改为utf8mb4
  • 为了安全起见,修复并优化所有表格。