php从字符串中提取表情符号

Mil*_*bar 4 php regex preg-match emoji telegram

我有一个包含表情符号的字符串.我想要从该字符串中提取表情符号,我正在使用下面的代码,但它不是我想要的.

$string = " hello world ";

preg_match('/([0-9#][\x{20E3}])|[\x{00ae}\x{00a9}\x{203C}\x{2047}\x{2048}\x{2049}\x{3030}\x{303D}\x{2139}\x{2122}\x{3297}\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u', $string, $emojis);
Run Code Online (Sandbox Code Playgroud)

我要这个:

$emojis =  ["", ""];
Run Code Online (Sandbox Code Playgroud)

但是回复一下:

$emojis = [""]
Run Code Online (Sandbox Code Playgroud)

如果:

$string = "?"
Run Code Online (Sandbox Code Playgroud)

它只返回第一个表情符号

$emoji = [""]
Run Code Online (Sandbox Code Playgroud)

cra*_*bin 6

试着看preg_match_all功能.preg_match停止照顾它找到第一场比赛,这就是为什么你只得到第一个表情符号.

取自这个答案:

preg_match停止照看第一场比赛.preg_match_all另一方面,继续查看,直到它完成处理整个字符串.找到匹配后,它会使用字符串的其余部分来尝试应用另一个匹配项.

http://php.net/manual/en/function.preg-match-all.php

所以你的代码将成为:

$string = " hello world ";

preg_match_all('/([0-9#][\x{20E3}])|[\x{00ae}\x{00a9}\x{203C}\x{2047}\x{2048}\x{2049}\x{3030}\x{303D}\x{2139}\x{2122}\x{3297}\x{3299}][\x{FE00}-\x{FEFF}]?|[\x{2190}-\x{21FF}][\x{FE00}-\x{FEFF}]?|[\x{2300}-\x{23FF}][\x{FE00}-\x{FEFF}]?|[\x{2460}-\x{24FF}][\x{FE00}-\x{FEFF}]?|[\x{25A0}-\x{25FF}][\x{FE00}-\x{FEFF}]?|[\x{2600}-\x{27BF}][\x{FE00}-\x{FEFF}]?|[\x{2900}-\x{297F}][\x{FE00}-\x{FEFF}]?|[\x{2B00}-\x{2BF0}][\x{FE00}-\x{FEFF}]?|[\x{1F000}-\x{1F6FF}][\x{FE00}-\x{FEFF}]?/u', $string, $emojis);

print_r($emojis[0]); // Array ( [0] =>  [1] =>  ) 
Run Code Online (Sandbox Code Playgroud)