2015-12-04 14 views
0

Если я запускаю этот код:PHP str_split на строку с расшифрованной html_entity

<?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;.

Я пробовал разные charsets, но не смог найти тот, который будет работать на всех.

Что я делаю неправильно? Есть ли способ заставить его работать для всех объектов? Или, по крайней мере, все «общие»?

Спасибо.

+1

Из [PHP Docs] (http://php.net/manual/en/function.str-split.php): 'Примечание: str_split() будет разделена на __bytes__, а не символы при работе с многобайтовой закодированной строкой. '(мой акцент) .... умные цитаты типа' ‘ 'переводятся на многобайтовый символ –

+0

Вы должны использовать' mb_split': http: // php .net/manual/en/function.mb-split.php для utf-8 – Zefiryn

ответ

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 или регулярное выражение.

Доказательство: https://3v4l.org/3FRmG

 Смежные вопросы

  • Нет связанных вопросов^_^