Php 如何正确地替换html实体?
我喜欢这样:Php 如何正确地替换html实体?,php,html-entities,Php,Html Entities,我喜欢这样: $mytext="that's really "confusing" and <absolutly> silly"; echo substr($mytext,0,6); 这种情况下的输出将是:that而不是that 我想要的是将html实体计算为1个字符,然后再计算substr,因为我总是在文本的结尾处出现中断的html或一些模糊的字符 请不要建议我先对它进行html解码,然后再进行substr
$mytext="that's really "confusing" and <absolutly> silly";
echo substr($mytext,0,6);
这种情况下的输出将是:that
而不是that
我想要的是将html实体计算为1个字符,然后再计算substr,因为我总是在文本的结尾处出现中断的html或一些模糊的字符
请不要建议我先对它进行html解码,然后再进行substr编码,我想要一个干净的方法:)
谢谢有两种方法可以做到这一点:
substr()
然后编码;或if (preg_match('!^([^&]|&(?:.*?;)){0,5}!s', $mytext, $match)) {
echo $match[0];
}
这意味着:从字符串的开头找到前面表达式的最多5个匹配项。前面的表达式是:
- 任何不是符号的字符;或
- 一个符号,后跟分号(即HTML实体)
在这里,我将cletus的代码复制粘贴到一个函数中。现在您可以用一行代码调用一个非常简单的三行函数。如果这不是“干净”的话,我就不明白“干净”是什么意思了。好吧,干净的方法只有一种: 根本不使用实体。
没有一个单一的原因可以替代实体化字符串。它只能用于输出。
所以,首先是substr,然后是编码 请尝试以下编码功能
<?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;
}
?>
如果使用
substr()
,请注意某些字符会破坏建议的解码+编码
例子
将输出:
- 在后院锻炼身体
- 锻炼身体�李>
(空字符串)
- 在我的身体里工作
- 在
中工作代码>关于我的健身
&hellip代码>输入
- 以下是对语法错误代码的更正,请使用mb_substr以避免出现意外情况,例如html实体的字符数较少,或者字符计数没有按应有的方式进行,在我的例子中,萨巴多变成了萨巴多:
function encoded_substr($string, $param, $param2){
$s = html_entity_decode($string);
$sub = mb_substr($s, $param, $param2);
return htmlentities($sub);
}
解码然后取一个substr有什么不干净的?你更愿意做各种各样的正则表达式还是某种查找和替换逻辑?我不知道你希望看到什么样的魔力。PHP函数是出于某种原因而存在的,不要重新发明轮子。这就是要走的路!谢谢。:)
<?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;
}
?>
$string=html_entity_decode("Workin’ on my Fitness…In the Backyard.");
echo $string;
echo substr($string,0,25);
echo htmlentities(substr($string,0,25));
echo mb_substr($string,0,25);
echo htmlentities(mb_substr($string,0,25));
function encoded_substr($string, $param, $param2){
$s = html_entity_decode($string);
$sub = mb_substr($s, $param, $param2);
return htmlentities($sub);
}