1

在正则表达式匹配中遇到新情况...我有一个包含单词、#hashtags、@useranmes 和其他杂项字符的字符串。

一些例子,因为它们变得越来越混乱。“我的新车”通常是可选的,并且不会存在,因为这是一个 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,#weekend,@me(以上所有,没有“我的新车”,通常会出现双间距等混乱)(然后人们会喜欢并添加在字符串中的表情符号中
  5. 我的新车#wheels #car \ud83d\ude2d\ud83d\ude2d\ud83d\ude2d\ud83d\ude02

期望的结果: 1. 我的新车 2. 我的新车 3. 我的新车 4. 我的新车 5. 我的新车

我做得很好,(^|\s)[#@](\w+)然后表情符号和有趣的方块开始发挥作用,表示为\ue412\ue412

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

有什么建议么?

4

2 回答 2

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您需要打开/uunicode 标志

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

输出:

string(10) "My New Car"

\x0-127(十六进制 00-ff)的转义码匹配 ascii 字符。任何高于\xffutf-8 字符的内容。

于 2011-12-10T10:20:56.737 回答
0

尝试这个:

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

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

于 2011-12-10T00:11:47.560 回答