【问题标题】:preg_match_all cut catches on accentuated characterspreg_match_all cut 捕捉重音字符
【发布时间】: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)

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

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

杰夫

【问题讨论】:

    标签: php regex string utf-8


    【解决方案1】:

    您的正则表达式中需要u 修饰符:

    preg_match_all('/#(\w+)/u',$string,$hashtags);
    

    http://php.net/manual/en/reference.pcre.pattern.modifiers.php

    【讨论】:

      【解决方案2】:

      在 PHP 中,您可以使用 \p{L}+ regex 和 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é                                                                                                                                                                                                                    
              )                                                                                                                                                                                                                                              
      
      )             
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-26
        • 2014-07-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-14
        • 1970-01-01
        相关资源
        最近更新 更多