我想用<
替换预标记之间的所有<
我正在php中尝试这个。
到目前为止,我已经工作了这么远,但正在努力走得更远:
preg_replace(''(<pre>)[<](<'/pre>)'', '<', $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("<", "<", $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 <
到<
。
在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 ( '<', '<',$val);
}
var_dump($out[1]);