如果介于<;pre>;标记替换所有<;与&;lt;


if between <pre> tags replace all < with &lt;

我想用&lt; 替换预标记之间的所有<

我正在php中尝试这个。

到目前为止,我已经工作了这么远,但正在努力走得更远:

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

我正在使用http://www.regexr.com/测试我的表达方式,但到目前为止还没有找到正确的表达方式。

感谢您的帮助。

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

如果没有嵌套的<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>中的代码匹配。测试regex101,Regex常见问题

  • 使用修饰语Uis:U(PCRE_UNGREEDY),i(PCRE_CASELESS),s(PCRE_DOTALL)
  • ''K重置比赛开始
  • (.*)任意数量的字符不自由(U修饰符)
  • 使用前瞻性来满足</pre>

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

在eval.in上测试它。如果它不起作用,可能有一个旧的PHP版本,不支持匿名函数,请使用这样的普通函数。

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

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

编辑

正如作者所认为的那样,改变问题的主旨是合适的。

使用http://www.php.net/manual/en/function.preg-split.php以将字符串向上拆分并根据需要应用CCD_ 10。

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

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

$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]);