【问题标题】:preg_match multi-byte characters by lengthpreg_match 多字节字符的长度
【发布时间】:2014-06-27 16:34:57
【问题描述】:

我有一些印度语言编码的数据。我想删除只有一两个字符的部分,例如这是两个字符:

ಎನ್

但它们是多字节的

我尝试使用正则表达式匹配这些:

'~\b[^ ]{1,2}\b~u'

但它不起作用。有什么想法吗?

根据选择的答案,使用 mb_ereg 函数的解决方案。这对我有用:

mb_regex_encoding( 'UTF-8' );
setlocale( LC_CTYPE, 'en_US.UTF-8' );
$str = 'ಆರ್‌ ವೆಂಕಟಲಕ್ಷ್ಮಿ ಎಸ್‌ ಎನ್‌ ಎನ್‌ ಪದ್ಮಾವತಿ ಎನ್';
echo $str . "\n";
echo mb_ereg_replace( '\b[^\s]{2,4}\b', ' @ ', $str );
echo "\n";

结果:

 @ ‌ ವೆಂಕಟಲಕ್ಷ್ಮಿ  @ ‌  @ ‌  @ ‌ ಪದ್ಮಾವತಿ  @

这不适用于 preg 函数。

【问题讨论】:

  • 所以如果你改用{4},它会匹配吗?
  • 似乎在Regex101 中工作,想知道您的PHP 中是否存在编码问题?
  • 没有。出于某种原因,我只剩下单词的前 1-2 个字符。
  • 我这里只有一场比赛:regex101.com/r/wQ5cQ6#pcre
  • 我认为问题可能与使用 \b (单词边界)有关。它似乎被忽略了。

标签: php regex unicode preg-match


【解决方案1】:

使用多字节安全函数mb_regex_encoding()mb_ereg_replace()。 (我不相信第一个是强制性的。也可以尝试不使用,看看是否足够。)

【讨论】:

  • @AmalMurali 我在 preg_match 手册页上没有看到任何关于多字节支持的信息。并且没有多字节安全 preg_* 变体。 (至少没有一个以 mb_preg_* 开头)
  • 您因提供正确答案而被否决的频率。我知道那种感觉。
  • @KohjahBreese 没关系。乐意效劳。那么告诉我们,mb_regex_encoding() 函数是必须具备的还是可以省略的?
  • 如果我省略了 mb_regex_encoding('UTF-8');函数,我得到了一个不想要的结果。所以这是必需的。感谢您的勤奋,否则可能无法解决此问题。到知识库:)
猜你喜欢
  • 2011-03-02
  • 2013-02-26
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多