strlen & специальные символы - PullRequest
2 голосов
/ 04 мая 2011

У меня проблема с поиском решения здесь .. Я разрабатываю тему WordPress для клиента, который использует цикл for() для перебора заголовка страницы, чтобы его можно было обернуть в <span> s. и отображается вертикально .. цикл использует strlen(), чтобы найти длину заголовка, но так как некоторые из заголовков страницы включают в себя «...» или запятые в заголовке, он возвращает символы html вместо этого. Я не могу понять, что вызывает это, и каждое усилие через htmlspecialchars_decode() или html_entity_decode() не работает .. какие-либо предложения? Что-то происходит с циклом for, о котором я сейчас знаю?

Так как он был запрошен, вот фактический код:

$p_title = get_the_title($port_page->ID);
   $title = '';

   for($i=0;$i<strlen($p_title);$i++){
   if(($p_title[$i])){
     $title .="<span>$p_title[$i]</span>";
    }

Я также пытался использовать mb_strlen .. проблема с поиском заменяемого конкретного символа не обязательно решает проблему, так как заголовки страниц произвольно устанавливаются владельцем сайта ..

Странно то, что заголовок никак не закодирован и эхо обычно перед циклом for .. Так что, как будто что-то его преобразовывает ..

Ответы [ 2 ]

5 голосов
/ 04 мая 2011

strlen() возвращает только число байтов в строке. Некоторые специальные символы могут быть представлены несколькими байтами, и Unicode может также сделать отдельные «символы», такие как символ авторского права («©»), занимающими много символов (например, &copy;).

Ваш "..." (многоточие) может быть специальным символом в Юникоде , например.

Быстрое и грязное решение, которое я предлагаю:

// Example string should be 1 character long, 6 bytes
$text = "&copy;";
$bytes = strlen($text);

mb_internal_encoding('UTF-8');    
$text = html_entity_decode($text, ENT_QUOTES, "UTF-8");                 
$length = mb_strlen($text);

print "String is ".$length." characters long, ".$bytes." bytes long";

Обратите внимание, что я предполагаю, что ваша строка уже UTF-8. Если это не так, сначала преобразуйте его.

1 голос
/ 04 мая 2011

Это очень похоже на проблему кодировки символов с многобайтовыми символами.Можете ли вы попробовать заменить strlen() на mb_strlen() и посмотреть, выполняет ли он эту работу?

http://php.net/manual/en/function.mb-strlen.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...