【问题标题】:str_replace for UTF-16 charactersstr_replace 用于 UTF-16 字符
【发布时间】:2016-10-25 21:04:28
【问题描述】:

我有一些包含字符的字符串,例如 \x{1f601},我想用一些文本替换它们。

当我使用 preg_replace 执行此操作时,它会是这样的:

preg_replace('/\x{1f601}/u', '######', $str)

但是,这似乎不适用于 str_replace:

str_replace("\x{1f601}", '######', $str)

如何使用 str_replace 进行此类替换?

【问题讨论】:

  • 您的文本实际上包含 9 个字符的长字符串“\x{1f601}”,还是包含字符“????”?以及 UTF-16 如何发挥作用?
  • 您是说preg_replace 有效,但str_replace 无效? UTF-16 也是一种编码 Unicode 字符的方法。你有 PHP 以 UTF-8 模式运行吗?

标签: php string unicode


【解决方案1】:

preg_replace 是 Regex 解析器/替换器,它是一个 Perl 正则表达式引擎,但 str_replaceNOT 并用明文方法替换事物

可以在regex101 中看到您获得的 Preg_replace,说明:

匹配字符集中位置为 0x1f601(十进制 128513 或八进制 373001)的字符 ?

但这可以转移到非正则表达式查找和替换,方法是直接将笑脸符号复制并粘贴到 str_replace 中。

$str = str_replace("?", '######', $str)

或者,通过阅读deceze's comment,它为您提供了一个干净、小巧的解决方案。

补充:

您正在使用非标准字符集,因此探索Mb_Str_replace (gitHub) 可能对您有用,它是mb_string PHP 函数集合的附属(但不是直接来自)。

最后:

既然你已经在做正则表达式 preg_replace,为什么还需要做字符串替换?另请阅读手册,其中清楚地说明了所有这些内容。

【讨论】:

  • 可以"\xF0\x9F\x98\x81" 写成字符串字面量等价物,而无需复制和粘贴?,也无需担心源代码编码...
  • 请注意,上面是 UTF-8 编码 字符?的字符串文字。如果 OP 正在处理的字符串实际上不是 UTF-8 编码的,那么他们需要将其调整为他们需要的任何编码......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
  • 2012-05-11
  • 1970-01-01
相关资源
最近更新 更多