仅限<code></code>上的php htmlentities!

时间:2011-02-14 05:12:34

标签: php html implode

我想仅对&lt; code&gt;中的内容运行htmlentities()剥离的东西&lt; / code&gt;

我写了一个函数,它接受一个字符串并在&lt; code&gt;之间找到内容。 &LT; /代码&GT;

function parse_code($string) {

        // test the string and find contents with <code></code>
        preg_match('@<code>(.*?)</code>@s', $string, $matches);

            // return the match if it succeeded
            if($matches) {
                return $matches[1];
            }else {
                return false;
            }
    }

// test the string and find contents with <code></code> preg_match('@<code>(.*?)</code>@s', $string, $matches); // return the match if it succeeded if($matches) { return $matches[1]; }else { return false; } }

但是我需要一些实际运行htmlentities()的函数的帮助;关于&lt; code&gt;中的内容&LT; /代码&GT;然后将它们全部重新崩溃。例如,假设我们在下面有字符串。

<div class="myclass" rel="stuff"> things in here </div>
<code> only run htmlentites() here so strip out things like < > " ' & </code>
<div> things in here </div>

再一次,该函数需要保持字符串的所有内容相同,但只修改并运行&lt; code&gt;的内容上的htmlentities()。 &LT; /代码&GT;

1 个答案:

答案 0 :(得分:5)

您可以使用自定义回调函数简化此操作:

$html = preg_replace_callback(
     "@  (?<= <code>)  .*?  (?= </code>)  @six",
     "htmlentities_cb", $html
);

function htmlentities_cb($matches) {
    return htmlentities($matches[0], ENT_QUOTES, "UTF-8");
}

匹配封闭代码标记的语法称为lookbehind and lookahead assertion。它简化了回调并避免了以后的implode(),因为断言匹配本身不会成为$ matches [0]的一部分。虽然@six用于case-insensitve标记匹配,但允许正则表达式中的空格使其更具可读性。