【问题标题】:preg_replace unicode characterspreg_replace unicode 字符
【发布时间】:2018-01-19 01:20:53
【问题描述】:

我有几个包含 unicode 的字符串。我的任务是从这些字符串中删除除 unicode 之外的所有内容,例如,在下面

\ud83d\ude82 + \u2600\ufe0f = \ud83d\ude29\ud83d\ude29\ud83d\ude29\ud83d\ude29\ud83d\ude29

会变成

\ud83d\ude82 \u2600\ufe0f \ud83d\ude29\ud83d\ude29\ud83d\ude29\ud83d\ude29\ud83d\ude29

然后我需要寻找重复的代码,并将它们分开,以便:

 \ud83d\ude29\ud83d\ude29\ud83d\ude29\ud83d\ude29\ud83d\ude29

变成:

\ud83d\ude29 \ud83d\ude29 \ud83d\ude29 \ud83d\ude29 \ud83d\ude29

我已经为第一位尝试了几个 preg_match 解决方案,但它要么不会从字符串中删除任何字符,要么会删除所有内容。下面是最新的尝试,

/(^\\\u[0-9a-f]{4})+/

对正则表达式不太熟悉,我开始困惑地挠头,因为我不确定还能尝试什么。

这样最终,我可以将每个 unicode 作为自己的记录插入到数据库中。

【问题讨论】:

  • 我认为第一步可以使用 RegEx 完成。但是如何找到重复代码?您只是展示了一个示例,而不是描述规则。对我来说,我认为规则应该将字符串与每两个 unicode 子字符串分组?

标签: php unicode preg-replace preg-match


【解决方案1】:

可以分两步完成:

$str = '\ud83d\ude82 + \u2600\ufe0f = \ud83d\ude29\ud83d\ude29\ud83d\ude29\ud83d\ude29\ud83d\ude29';
// remove non unicode character
$str = preg_replace('/(?<=\\\\u[a-f0-9]{4})[^\\\\]+/', '', $str);
// insert space between repeated pair
$str = preg_replace('/((?:\\\u[a-f0-9]{4}){2})(?=\1)/', '$1 ', $str);
echo $str,"\n";

输出:

\ud83d\ude82\u2600\ufe0f\ud83d\ude29 \ud83d\ude29 \ud83d\ude29 \ud83d\ude29 \ud83d\ude29

正则表达式 #1:

/                       : regex delimiter
  (?<=                  : lookahead
    \\\\u[a-f0-9]{4}    : unicode character
  )                     : end lookahead
  [^\\\\]+              : 1 or more any character that is NOT a backslash
/                       : regex delimiter

正则表达式 #2:

/                       : regex delimiter
  (                     : start group 1
    (?:                 : non capture group
      \\\\u[a-f0-9]{4}  : a unicode character
    ){2}                : appears twice (2 unicode characters)
  )                     : end group 1
  (?=\1)                : lookahead, group 1 is repeated
/                       : regex delimiter

【讨论】:

  • 这非常完美!我注意到一件事。我的数据库中有一个条目 - “\ud83d\udc3e\ud83d\udc36”实际上是 2 个单独的表情符号。在这种情况下,无论如何要在它们之间添加一个空格吗?所以你会得到“\ud83d\udc3e \ud83d\udc36”吗?
  • @Jayp:对于这个特定的替换,你可以这样做:$str = preg_replace('/(\\\\ud83d\\\\udc3e)(\\\\ud83d\\\\udc36)/', '$1 $2', $str);
猜你喜欢
  • 1970-01-01
  • 2019-03-08
  • 2012-04-16
  • 2015-10-29
  • 2016-02-09
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多