У меня есть строка с HTML-тегами в PHP-Variable, то есть:
$str = '<html>
<body>
<div id="box1">[CODE]<span class="test">Hello World</span>[/CODE]</div>
<div id="box2">[CODE]<strong class="test2">Nice to meet you!</strong>[/CODE]</div>
</body>
</html>';
Теперь я хочу проанализировать строку и использовать htmlspecialchars, но только внутри маркеров [CODE] и [/CODE]. Все теги вне маркеров следует игнорировать.
Результат должен быть:
$str = ' [...] <div id="box1"><span class="test">Hello World</span></div> [...]';
Есть ли решение через preg_replace?
Использовать preg_replace_callback
$str = '<html>
<body>
<div id="box1">[CODE]<span class="test">Hello
[CODE] World</span>[/CODE]</div>
<div id="box2">[CODE]<strong class="test2">Nice to meet you!</strong>[/CODE]</div>
</body>
</html>';
echo preg_replace_callback ('/\[CODE\](.*?)\[\/CODE\]/s', function ($matches) {return htmlspecialchars($matches[1]);}, $str);
результат
<html>
<head/><body>
<div id="box1"><span class="test">Hello
[CODE] World</span></div>
<div id="box2"><strong class="test2">Nice to meet you!</strong></div>
</body>
</html>
Это должно быть то, что вы ищете, также устраняя маркеры [CODE]
:
<?php
$pattern = '/\[CODE\](.*)\[\/CODE\]/';
$replace = function($m) { return htmlspecialchars($m[1]); };
$subject = <<<EOT
<html>
<body>
<div id="box1">[CODE]<span class="test">Hello World</span>[/CODE]</div>
<div id="box2">[CODE]<strong class="test2">Nice to meet you!</strong>[/CODE]</div>
</body>
</html>
EOT;
echo preg_replace_callback($pattern, $replace, $subject);
Вышеуказанный результат:
<html>
<body>
<div id="box1"><span class="test">Hello World</span></div>
<div id="box2"><strong class="test2">Nice to meet you!</strong></div>
</body>
</html>