正则表达式用一些特殊情况替换基本的@username和#hashtag

时间:2011-12-09 23:40:10

标签: regex emoji

在正则表达式比赛中坚持一个新案例...... 我有一个包含单词,#hashtgs,@ useranmes和其他misc字符的字符串。

一些例子,因为它们变得更加混乱和混乱。 “我的新车”通常是可选的,并且不会存在,因为这是一个preg替换,我将以空字符串结束,在我的情况下,这是可取的。但是,如果“我的新车”确实存在,那将是所需的字符串

  1. 我的新车#wheels #car #auto #drive #weekend
  2. 我的新车#wheels #car #auto #drive #weekend @me
  3. 我的新车#wheels,#car,#auto,#drive,#weekend
  4. 我的新车#wheels,#car,#auto,#drive,#week,@ me (以上所有,没有'我的新车',通常是双倍间距的混乱等) (然后人们开始喜欢并在字符串中加入表情符号
  5. 我的新车#wheels #car \ ud83d \ ude2d \ ud83d \ ude2d \ ud83d \ ude2d \ ud83d \ ude02
  6. 期望的结果: 我的新车 我的新车 我的新车 我的新车 5.我的新车

    我在(^|\s)[#@](\w+)做得非常好,然后表情符号以及有趣的方块came发挥作用,表现为\ ue412 \ ue412

    我想我只需要找到一种方法来说明是否以\ remove开头到最后。我想要走另一条道路,否定任何不是[a-zA-Z0-9]的东西,但这也是多语言。

    有什么建议吗?

2 个答案:

答案 0 :(得分:0)

试试这个:

(?:[#@]\S+|\\\S+)

适用于所有示例,包括“凌乱”的示例。

答案 1 :(得分:0)

json_decode函数会将ascii转义序列转换为实际的utf-8 unicode字符。

$t = "My New Car #wheels #car \ud83d\ude2d\ud83d\ude2d\ud83d\ude2d\ud83d\ude02";
$s = json_decode("\"$t\"");
var_dump($s);

输出:

string(40) "My New Car #wheels #car "

要考虑preg_replace中的这些字符,您需要打开/u unicode标志

$r = preg_replace("/\s*([#@]\S+|[^\\x00-\\xff])\s*/u", "", $s);
var_dump($r);

输出:

string(10) "My New Car"

0-127(十六进制00-ff)中的\x转义码与ascii字符匹配。高于\xff的任何东西都是utf-8字符。