【问题标题】:How do i match with regex special chars that are not alphanumeric whilst ignoring emojis?如何在忽略表情符号的同时匹配非字母数字的正则表达式特殊字符?
【发布时间】:2019-07-15 08:37:42
【问题描述】:

我目前遇到问题,我不知道如何让正则表达式匹配特殊字符而忽略表情符号。

例如,我想匹配此字符串中不是表情符号的特殊字符:❤️???????????????????????????❤️

目前作为我的正则表达式我有

[^\x00-\x7F]+

当前输出:❤️??????????????????????????????❤️

想要的输出:????????????????????????????

我将如何解决这个问题?

【问题讨论】:

  • 我认为你倒退了,???????????????????????????? 是字母数字 [\pL\pN]+不是特别的 [^\pL\pN]+ 最终的解决方案是你必须越过大部分是要匹配的序列,然后(*SKIP)(*FAIL) 它们。

标签: php regex


【解决方案1】:

也许,这个表达式可能有效:

$re = '/[\x{1f300}-\x{1f5ff}\x{1f900}-\x{1f9ff}\x{1f600}-\x{1f64f}\x{1f680}-\x{1f6ff}\x{2600}-\x{26ff}\x{2700}-\x{27bf}\x{1f1e6}-\x{1f1ff}\x{1f191}-\x{1f251}\x{1f004}\x{1f0cf}\x{1f170}-\x{1f171}\x{1f17e}-\x{1f17f}\x{1f18e}\x{3030}\x{2b50}\x{2b55}\x{2934}-\x{2935}\x{2b05}-\x{2b07}\x{2b1b}-\x{2b1c}\x{3297}\x{3299}\x{303d}\x{00a9}\x{00ae}\x{2122}\x{23f3}\x{24c2}\x{23e9}-\x{23ef}\x{25b6}\x{23f8}-\x{23fa}]/u';
$str = '❤️???????❤️';
$subst = '';

echo preg_replace($re, $subst, $str);

输出

???????️

如果您想探索/简化/修改它,this demo 的右上方面板上会解释该表达式。

参考:

javascript unicode emoji regular expressions

【讨论】:

    【解决方案2】:

    使用以下 unicode 正则表达式:

    [^\p{M}\p{S}]+
    
    • \p{M} 匹配打算与另一个字符组合的字符(此处为)。
    • \p{S} 匹配符号(在本例中为)。

    Demo

    【讨论】:

    • \p{S} 与所有表情符号/符号不匹配,例如:?
    • @NS 您可以使用\p{Cs} 匹配不是符号和封闭标记组合的表情符号。 [\p{Cs}\p{M}\p{S}]+ 将匹配所有表情符号。
    【解决方案3】:

    我认为您帖子的标题与正文不符。

    表情符号和 AlphaNum 字符之间几乎没有重叠。
    有几个键帽表情符号,但由于它们的顺序超出了
    第一个数字不与字母重叠,只需放上就足够了
    对 alphanum 类前面的负面展望。

    '~(?![0-9]\x{FE0F}\x{20E3}|\x{2139})[\pL\pN]+~'

    https://regex101.com/r/1JcUqY/1

    【讨论】:

      猜你喜欢
      • 2022-08-17
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2021-11-03
      相关资源
      最近更新 更多