我喜欢这个:
$mytext="that's really "confusing" and <absolutly> silly";
echo substr($mytext,0,6);
在这种情况下,输出将是:that&#
而不是that's
我想要的是将html实体计为1个字符然后是substr,因为我总是在文本末尾使用破解的html或一些不起眼的字符。
请不要建议我html解码然后substr然后编码它,我想要一个干净的方法:)
由于
答案 0 :(得分:4)
有两种方法可以做到这一点:
您可以解码HTML实体substr()
然后编码;或
您可以使用正则表达式。
(1)使用html_entity_decode()
和htmlentities()
:
$s = html_entity_decode($mytext);
$sub = substr($s, 0, 6);
echo htmlentities($sub);
(2)可能是这样的:
if (preg_match('!^([^&]|&(?:.*?;)){0,5}!s', $mytext, $match)) {
echo $match[0];
}
这是说:从字符串的开头找到最多5次前面的表达式。前面的表达式是:
任何不是符号的角色;或
&符号,后跟任何包括分号(即HTML实体)的内容。
这不完美,所以我赞成(1)。
答案 1 :(得分:3)
function encoded_substr($string, $param, $param2){
$s = html_entity_decode($string);
$sub = substr($s, $param, $param2);
return htmlentities($sub);
}
在那里,我将cletus'代码复制到一个函数中。现在,您可以使用1行代码调用非常简单的3行函数。如果这不是“干净”,那么我很困惑“干净”意味着什么。
答案 2 :(得分:2)
如果您使用substr()
,请注意某些字符会破坏建议的解码+编码。
$string=html_entity_decode("Workin’ on my Fitness…In the Backyard.");
echo $string;
echo substr($string,0,25);
echo htmlentities(substr($string,0,25));
(空字符串)使用mb_substr()
。
echo mb_substr($string,0,25);
echo htmlentities(mb_substr($string,0,25));
’
In …
答案 3 :(得分:1)
请尝试以下编码功能。
<?php
$mytext="that's really "confusing" and <absolutly> silly";
echo limit_text($tamil_var,6);
function limit_text($text,$limit){
preg_match_all("/&(.*)\;/U", $text, $pat_array);
$additional=0;
foreach ($pat_array[0] as $key => $value) {
if($key <$limit){$additional += (strlen($value)-1);}
}
$limit+=$additional;
if(strlen($text)>$limit){
$text = substr( $text,0,$limit );
$text = substr( $text,0,-(strlen(strrchr($text,' '))) );
}
return $text;
}
?>
答案 4 :(得分:0)
嗯,干净的方法只有一个:
根本不使用实体。
没有一个理由可以替换有效的字符串。它只能用于输出
所以,先是substr,然后编码。
答案 5 :(得分:0)
这是对语法错误代码的更正,使用mb_substr来避免像html实体具有更少字符的意外,或者字符计数不能正常工作,在我的案例中Sábado成为Sá:
function encoded_substr($string, $param, $param2){
$s = html_entity_decode($string);
$sub = mb_substr($s, $param, $param2);
return htmlentities($sub);
}