【问题标题】:Decode invalid parsed string like "u0627u0644u0649 u0627u0644u0623" (PHP)解码无效的解析字符串,如“u0627u0644u0649 u0627u0644u0623”(PHP)
【发布时间】:2020-05-11 07:33:22
【问题描述】:

我发现了一些包含"u0627u0644u0649 u0627u0644u0623" 之类的行的数据。通常,这些更像\u0627\u0644\u0649 \u0627\u0644\u0623,但数据出了点问题。为了纠正它,我唯一的选择是调整那里的内容。

我没有发现任何字符串是"u0627u0644u0623 u0644 u0627" 和“普通单词”的组合的情况,但这可能会发生。

我还想安全地转换 "\u0627\u0644" 之类的任何内容或其组合,以便正确转换像“我的字符串 \u0627\u0644 u0627u0644u0623 u0644 u0627."”之类的字符串。

谁能推荐一个正则表达式或适当的方法来安全地“修复”这些字符串?

更新

如果我们只更正我们第一次测试的字符串以确保它只包含像u0627u0644u0649 u0627u0644u0623 这样的字符串呢?这可以安全地(以及如何)完成吗?

现在,我正在使用

^(u[A-Fa-f0-9]{4}\s?)+$

我的正则表达式足以满足所需的目的。我也同意可能没有保证的解决方案,但到目前为止这似乎在我的测试用例中有效。

【问题讨论】:

  • 如果常规文本与这些损坏的十六进制代码粘在一起,您将无法获得 100% 安全的解决方案。
  • 如果我们只更正我们第一次测试的字符串以确保它只包含像“u0627u0644u0649 u0627u0644u0623”这样的字符串怎么办?这可以安全地(以及如何)完成吗?谢谢!
  • 是的,^(?:\W*u[A-Fa-f0-9]{4})\W*$
  • 谢谢。我对其进行了测试,它只为 preg_match 为“u0f40”之类的字符串返回 true,而不是“u0f40 u0f40”或“u0f40u0f40 u0f40”之类的字符串,并且它对“\u0f40”之类的字符串返回 true,这是不应该的。
  • 我相信这行得通 - 你能确认一下吗? ^(u[A-Fa-f0-9]{4}\s?)+$

标签: php regex string unicode


【解决方案1】:

^(u[A-Fa-f0-9]{4}\s?)+$ 模式找不到前导空格的匹配项。

要仅匹配包含 u[A-Fa-f0-9]{4} 和空格 (\s) 模式的字符串,您可以使用

'~^\s*u[A-Fa-f0-9]{4}(?:\s*u[A-Fa-f0-9]{4})*\s*$~'

regex demo

详情

  • ^ - 字符串开头
  • \s* - 0+ 个空格
  • u[A-Fa-f0-9]{4} - u 然后是四个十六进制字符
  • (?:\s*u[A-Fa-f0-9]{4})* - 0 次或多次出现的序列
    • \s* - 0+ 个空格
    • u[A-Fa-f0-9]{4} - u 然后是四个十六进制字符
  • \s* - 0+ 个空格
  • $ - 字符串结束。

您可以在 PHP 中将其缩短为 '~^\s*(u[A-Fa-f0-9]{4})(?:\s*(?1))*\s*$~'

【讨论】:

    猜你喜欢
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2013-12-07
    • 2014-01-24
    • 2017-01-27
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多