htmlentities HTML标记内的某些字符串

时间:2013-04-02 07:54:22

标签: php

我有这个字符串:

$str = "<ul><li>Eüro!</li><li>100 %</li><li>Jäckö<br></li></ul>";

我打算在htmlentities()内的字符串上使用<li></li>。所以它会像这样出现:

$str = "<ul><li>E&uuml;ro!</li><li>100 %</li><li>J&auml;ck&ouml;<br></li></ul>";

htmlentities()是否有办法或解决方法不转换整个字符串?因为如果我只是htmlentities($str),它会将整个字符串转换为:

&lt;ul&gt;&lt;li&gtE&uuml;ro!&lt;/li&gt;&lt;li&gt;100 %&lt;/li&gt;&lt;li&gt;J&auml;ck&ouml;&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;

4 个答案:

答案 0 :(得分:0)

documentation,你可以看到你有一些旗帜:

string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 [, string $encoding = 'UTF-8' [, bool $double_encode = true ]]] )

所以你可以在这里看到一些字符串的输出:

<?php
  $str = "A 'quote' is <b>bold</b>";

  // Produces: A 'quote' is &lt;b&gt;bold&lt;/b&gt;
  echo htmlentities($str);

  // Produces: A &#039;quote&#039; is &lt;b&gt;bold&lt;/b&gt;
  echo htmlentities($str, ENT_QUOTES);
?>

我认为这取决于您的默认字符代码,因此您可以尝试不同的标记。

答案 1 :(得分:0)

找到一种不将它作为单个字符串传递的方法,直到你有htmlentities() - 子函数。将其视为一系列列表项,然后在从中构建<ul>时调用每个列表项的htmlentities。任何其他意味着你很有可能出现XSS漏洞。

答案 2 :(得分:0)

$str = '<ul><li>Eüro!</li><li>100 %</li><li>Jäckö<br></li></ul>';


function update_li_content($text){        
    return "<li>".htmlentities($text[1])."</li>";
}

$reg = "#<li>(.*?)</li>#";

$filter_data =  preg_replace_callback ( $reg, "update_li_content", $str);

echo $filter_data;

答案 3 :(得分:-1)

您可以创建自己的替换功能:

function parseAccents($in) {
    $out=$in;
    $toreplace=array(
        array('ü', '&uuml;'),
        array('ä', '&auml;'),
        array('ö', '&ouml;')
        // ...  
    );
    for($i=0; $i<count($toreplace); $i++) $out=str_replace($toreplace[$i][0], $toreplace[$i][1], $out);
    return $out;
}

编辑:如果您不想设置整个重音列表,可以使用此模型:

function parseAccents($in) {
    $out=htmlentities($in);
    $toreplace=array(
        array('&lt;', '<'),
        array('&gt;', '>'),
        // ...  
    );
    for($i=0; $i<count($toreplace); $i++) $out=str_replace($toreplace[$i][0], $toreplace[$i][1], $out);
    return $out;
}