0

我有这个字符串:

$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

4 回答 4

0

文档中,您可以看到您有一些标志:

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);
?>

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

于 2013-04-02T08:00:55.897 回答
0

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

于 2013-04-02T08:18:40.850 回答
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;
于 2013-04-02T10:29:35.630 回答
-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;
}
于 2013-04-02T07:59:49.373 回答