带有解码后的html_entity的字符串上的PHP str_split

时间:2015-12-04 23:21:02

标签: php html-entities strsplit

如果我运行此代码:

<?php
$string = 'My string &lsquo;to parse&rsquo;';
$string_decoded = html_entity_decode($string, ENT_QUOTES, 'utf-8');
$string_array = str_split($string_decoded);
var_dump($string_array);
?>

我得到了这个结果:

array (size=28)
  0 => string 'M' (length=1)
  1 => string 'y' (length=1)
  2 => string ' ' (length=1)
  3 => string 's' (length=1)
  4 => string 't' (length=1)
  5 => string 'r' (length=1)
  6 => string 'i' (length=1)
  7 => string 'n' (length=1)
  8 => string 'g' (length=1)
  9 => string ' ' (length=1)
  10 => string '�' (length=1)
  11 => string '�' (length=1)
  12 => string '�' (length=1)
  13 => string 't' (length=1)
  14 => string 'o' (length=1)
  15 => string ' ' (length=1)
  16 => string 'p' (length=1)
  17 => string 'a' (length=1)
  18 => string 'r' (length=1)
  19 => string 's' (length=1)
  20 => string 'e' (length=1)
  21 => string '�' (length=1)
  22 => string '�' (length=1)
  23 => string '�' (length=1)

正如你所看到的,我不是用解码的单引号(左/右),而是为每个引号得到这三个字符......

我注意到这种情况发生在一些实体上,而不是其他实体。提出此问题的一些人是&lsquo; &rdquo; $copy;。一些不存在相同问题的是&amp; $gt;

我尝试了不同的字符集,但找不到适合所有人的字符。

我做错了什么?有没有办法让它适用于所有实体?或者至少是所有“常见的”?

感谢。

1 个答案:

答案 0 :(得分:1)

这应该做得很好:

function mb_str_split($string) {
    return preg_split('/(?<!^)(?!$)/u', $string );
}
$string = 'My string &lsquo;to parse&rsquo;';
$string = utf8_encode($string);
$string_decoded = html_entity_decode($string, ENT_QUOTES, 'utf-8');
$string_array = mb_str_split($string_decoded);
var_dump($string_array);

如评论中所述:您需要使用mb_split或regex拆分字符串。

证明:https://3v4l.org/3FRmG