我的目标是收集类似推文的字符串的每个#标签:
$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)
array(size = 1)0 =>字符串'#study'(长度= 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)
array(size = 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)
array(size = 1)0 =>字符串'#study'(长度= 6)
在这种情况下,我如何收集带有突出字符的主题标签?
我提前感谢您提供任何帮助或建议!
杰夫
答案 0 :(得分:1)
你的正则表达式中需要u
修饰符:
preg_match_all('/#(\w+)/u',$string,$hashtags);
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
答案 1 :(得分:0)
在PHP中,您可以使用\p{L}+
正则表达式和u
选项捕获这些字母:
$string = "i like to #studyéléctricité in french";
preg_match_all('/#(\p{L}+)/u',$string,$hashtags);
print_r($hashtags);
输出:
Array
(
[0] => Array
(
[0] => #studyéléctricité
)
[1] => Array
(
[0] => studyéléctricité
)
)