php htmlentities только на <code></code>! - PullRequest
2 голосов
/ 14 февраля 2011

Я хочу запустить htmlentities () только для содержимого в things to strip

Я написал функцию, которая принимает строку и находит содержимое в диапазоне

function parse_code($string) {</p> <pre><code> // test the string and find contents with <code>preg_match ('@ (.*?) @ s', $ строка, $ совпадения);// возвращаем совпадение, если оно прошло успешно if ($ match) {return $ match [1];} else {return false;}}

Однако мне нужна помощь с функцией, которая будет фактически запускать htmlentities ();на содержимое в , а затем взорвать () все это вместе.Например, допустим, у нас есть строка ниже.

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

Еще раз, функция должна будет сохранить все содержимое строки одинаковыми, но только изменить и запустить htmlentities () для содержимого

1 Ответ

5 голосов
/ 14 февраля 2011

Вы можете упростить это с помощью пользовательской функции обратного вызова:

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

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

Синтаксис для сопоставления тегов кода вложения называется lookbehind и утверждение lookahead .Это упрощает обратный вызов и избегает implode () позже, потому что утверждение совпадает само по себе, не становятся частью $ match [0].Хотя @six предназначен для сопоставления тегов без учета регистра и позволяет использовать пробел в регулярном выражении, чтобы сделать его более читабельным.

...