preg_match_all削减强调字符的捕获量

时间:2015-04-03 08:33:12

标签: php regex string utf-8

我的目标是收集类似推文的字符串的每个#标签:

$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)

在这种情况下,我如何收集带有突出字符的主题标签?

我提前感谢您提供任何帮助或建议!

杰夫

2 个答案:

答案 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);

这是working sample program

输出:

Array                                                                                                                                                                                                                                                  
(                                                                                                                                                                                                                                                      
    [0] => Array                                                                                                                                                                                                                                       
        (                                                                                                                                                                                                                                              
            [0] => #studyéléctricité                                                                                                                                                                                                                   
        )                                                                                                                                                                                                                                              

    [1] => Array                                                                                                                                                                                                                                       
        (                                                                                                                                                                                                                                              
            [0] => studyéléctricité                                                                                                                                                                                                                    
        )                                                                                                                                                                                                                                              

)