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编码,我想要一个干净的方法:)


谢谢有两种方法可以做到这一点:

  • 您可以解码HTML实体,
    substr()
    然后编码;或

  • 可以使用正则表达式

  • (1) 使用和:

    (2) 可能是这样的:

    if (preg_match('!^([^&]|&(?:.*?;)){0,5}!s', $mytext, $match)) {
      echo $match[0];
    }
    
    这意味着:从字符串的开头找到前面表达式的最多5个匹配项。前面的表达式是:

    • 任何不是符号的字符;或

    • 一个符号,后跟分号(即HTML实体)

    这不是完美的,所以我赞成(1)


    在这里,我将cletus的代码复制粘贴到一个函数中。现在您可以用一行代码调用一个非常简单的三行函数。如果这不是“干净”的话,我就不明白“干净”是什么意思了。

    好吧,干净的方法只有一种: 根本不使用实体。
    没有一个单一的原因可以替代实体化字符串。它只能用于输出。

    所以,首先是substr,然后是编码

    请尝试以下编码功能

    <?php
    
    $mytext="that&#039;s really &quot;confusing&quot; and &lt;absolutly&gt; 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&#039;s really &quot;confusing&quot; and &lt;absolutly&gt; 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&#8217; on my Fitness&#8230;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);
        }