如果在<pre> tags replace all &lt; with &lt;</pre>之间

时间:2014-04-13 16:10:14

标签: php regex expression

我想用<

替换预标签之间的所有&lt;

我在php中尝试这个。

到目前为止,我已经做了很多工作,但我正在努力进一步:

preg_replace('\(<pre>)[<](<\/pre>)\', '&lt;', $content);

我正在使用http://www.regexr.com/测试我的表达,但到目前为止找不到合适的表达式。

任何帮助表示赞赏。

使用htmlspecialchars的问题在于其用户输入。所以我不能告诉字符串中的位置,甚至他们是否会使用pre标签。但如果他们这样做,我希望这些规则适用。所以不能专门针对它。

3 个答案:

答案 0 :(得分:1)

只需使用http://docs.php.net/manual/en/function.htmlspecialchars.php对这些字符进行编码

 echo "<pre>" . htmlspecialchars($content) . "</pre>";

修改

正如作者认为适合改变问题的主旨一样。

使用http://www.php.net/manual/en/function.preg-split.php拼接字符串并根据需要应用htmlspecialchars

我会建议正则表达式<pre/?>

答案 1 :(得分:1)

如果没有嵌套的<pre - 代码,我会使用preg_replace_callback

$str = "<pre>< left < arrow < <</pre>";

$pattern = '~<pre[^>]*>\K.*(?=</pre>)~Uis';

$str = preg_replace_callback($pattern, function ($m) {
         return str_replace("<", "&lt;", $m[0]);
       }, $str);

echo $str;

模式匹配<pre...>...</pre>内的代码。 Test on regex101Regex FAQ

  • 使用modifiers Uis:U(PCRE_UNGREEDY),i(PCRE_CASELESS),s(PCRE_DOTALL)
  • \K重置比赛的开头
  • (.*)任意数量的字符ungreedy(U修饰符)
  • 使用前瞻来满足</pre>

calback是一个简单的str_replace <&lt;

eval.in上测试。如果它不起作用,可能有较旧的PHP版本,但不支持anonymous functions,请使用普通函数like this

答案 2 :(得分:0)

这是我永远不会做的事,但如果需要,这是一种方法:

$text = "<pre>
last_name, first_name
<bjorge>, philip
kardashian, kim
mercury, freddie
</pre>
adgrgws, apvoih
asvpaiovjas aspvojas ass0voj
<pre>
last_name2, first_name
<bjorge>, philip
kardashian, kim
mercury, freddie
</pre>";

preg_match_all("#\<pre\>(.+?)\<\/pre\>#s",$text,$out);

var_dump($out[1]);

foreach($out[1] as &$val){
$val = str_replace ( '<', '&lt;',$val);
}
var_dump($out[1]);