2011-05-04 111 views
2

我在这里找到一个解决方案的问题..我正在开发一个客户端的WordPress主题,使用for()循环遍历页面的标题,以便它可以包装在<span> s并垂直显示..该循环使用strlen()找到标题的长度,但由于一些页面标题包括'...'或标题中的逗号,它会返回的HTML字符而不是..我不明白什么是导致通过htmlspecialchars_decode()html_entity_decode()无法正常工作..任何建议?我现在知道的for循环有什么问题吗?strlen和特殊字符

既然在这里要求的是实际代码:

$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循环之前..所以这是因为如果事情是将它..

+1

你能准确地显示你正在做一个'strlen()'的数据类型吗?也可能是一些代码。 – 2011-05-04 17:47:45

+0

你想解码HTML实体或从字符串中删除它们吗?如果你想删除它们,你必须解码它们,然后使用str_replace删除它们。 – 2011-05-04 17:54:25

+0

检查functions.php文件以查看是否有任何内容正在过滤get_the_title()函数并将其转换? – 2011-05-04 19:02:18

回答

1

这听起来很像一个charact呃多字节字符编码问题。你可以尝试用mb_strlen()替换strlen(),看看它是否能完成这项工作?

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

+0

我试过,没有成功.. – Tim 2011-05-04 18:53:21

4

strlen()只返回字符串的字节数。某些特殊字符可以用多个字节表示,Unicode还可以使单个“字符”像版权符号(“©”)占用许多字符(例如&copy;)。

例如,您的“...”(省略号)可以是special character in Unicode

快速和肮脏的解决方案,我建议:

// 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。如果不是,请先将其转换。