【发布时间】:2015-04-03 08:33:12
【问题描述】:
我的目标是将类似推文的字符串的每个主题标签收集为:
$string = "i like to #studyéléctricité in french";
preg_match_all('/#(\w+)/',$string,$hashtags);
它正确地捕获了这个没有重音符号的主题标签,并将它们放入数组 $hashtags 中。
但是对于我的字符串,它只会收集正常捕获的一部分,在遇到的第一个重音字符处将其剪切:
var_dump(mb_detect_encoding($string));
var_dump($hashtags[0]);
它返回了
字符串“UTF-8”(长度=5)
数组 (size=1) 0 => 字符串 '#study' (length=6)
经过测试的解决方案:
1) 字符串是 UTF-8,所以我尝试了特定的正则表达式
preg_match_all('/#(\w+)/u', $string, $hashtags);
preg_match_all('/#(pL+)/u', $string, $hashtags);
preg_match_all('/#(p{L}+)/u', $string, $hashtags);
preg_match_all('/#(\pL+)/u', $string, $hashtags);
preg_match_all('/#(\p{L}+)/u', $string, $hashtags);
这些都返回了空数组。
2) 我尝试将编码更改为 ISO-8859-15:
$string = mb_convert_encoding($string, 'ISO-8859-15', 'UTF-8');
preg_match_all('/#(\w+)/',$string,$hashtags);
var_dump(mb_detect_encoding($string));
var_dump($hashtags[0]);
它返回了:
字符串'ASCII'(长度=5)
数组(大小=1)0 => 字符串'#studylctricit'(长度=14)
3) 我也尝试过使用 iconv:
$string = iconv($string, 'UTF-8', 'ISO-8859-15');
preg_match_all('/#(\w+)/',$string,$hashtags);
var_dump(mb_detect_encoding($string));
var_dump($hashtags[0]);
它返回了:
字符串'ASCII'(长度=5)
数组 (size=1) 0 => 字符串 '#study' (length=6)
在这种情况下,我如何收集带有强调字符的主题标签?
提前感谢您提供的任何帮助或建议!
杰夫
【问题讨论】: