PHP:仅在定义的标记之间使用htmlspecialchars
我在PHP变量中有一个带有HTML标记的字符串,即:PHP:仅在定义的标记之间使用htmlspecialchars,php,regex,preg-replace,preg-match,Php,Regex,Preg Replace,Preg Match,我在PHP变量中有一个带有HTML标记的字符串,即: $str = '<html> <body> <div id="box1">[CODE]<span class="test">Hello World</span>[/CODE]</div> <div id="box2">[CODE]<strong class="test2">Nice to me
$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>';
$str='1〕
[代码]你好,世界[/CODE]
[CODE]很高兴认识您[/CODE]
';
现在我想解析字符串并使用htmlspecialchars,但只在标记[CODE]和[/CODE]中使用。应忽略标记之外的所有标记
结果应该是:
$str = ' [...] <div id="box1"><span class="test">Hello World</span></div> [...]';
$str='[…]span class=“test”你好世界/span[…]”;
是否有通过preg_replace解决方案?使用
$str='1〕
[代码]你好
[CODE]世界[/CODE]
[CODE]很高兴认识您[/CODE]
';
echo preg\u replace\u回调('/\[CODE\](.*?\[\/CODE\]/s',函数($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>
span class=“test”您好
[代码]世界/span
strong class=“test2”很高兴认识您/坚强的
使用
$str='1〕
[代码]你好
[CODE]世界[/CODE]
[CODE]很高兴认识您[/CODE]
';
echo preg\u replace\u回调('/\[CODE\](.*?\[\/CODE\]/s',函数($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>
span class=“test”您好
[代码]世界/span
strong class=“test2”很高兴认识您/坚强的
这应该是您正在寻找的,同时也消除了[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);
这应该是您正在寻找的,同时也消除了[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);
<代码>你可能想考虑一下你还想从字符串中删除代码吗?你可能想考虑一下,你还想从字符串中删除代码吗?@ PeDoLoBito,这就是重点。这是BB代码,所以您希望删除BB代码标记。我想我当时误解了这个问题。当同一行中有多个[Code]
标记,并且有换行符时,您的模式失败。@PedroLobito这就是重点。这是BB代码,所以您希望删除BB代码标记。我想我当时误解了这个问题。当同一行中有多个[Code]
标记,并且有换行符时,您的模式失败。有趣的是:对完美工作答案的匿名否决投票。LOLHi arkascha,我正在测试您的代码,但不幸的是,输出只包含[code]和[/code]标记之间的部分。[CODE]标记之外的所有内容都丢失了。我做错了什么?@Christoph对不起,我不能同意你的说法。输出清楚地包含[code]
标记之外的部分。在上面的答案中,它是如何显示为输出的。但是,您可能尝试使用html浏览器查看结果。在这种情况下,浏览器显然会解释外部html标记,因此它在字面意义上是不可见的。尝试使用var\u dump()
而不是echo
语句,或者将输出包含在
标记中,或者在CLI上尝试代码。/yes,我通过使用-tags修复了问题。但是现在我有一个问题,函数只触发一次。事实上,[CODE]和[/CODE]之间的第一个元素被正确解析,第二个元素被忽略-(@Christoph:我不能同意这一点。我在上面发布的输出正是我执行代码时得到的结果。因此两者都包含[code]
部分被正确替换,我只是再次检查,以确保。没有理由限制替换。在使用上述代码的方式上肯定存在其他差异。有趣的是:对完美工作答案的匿名否决票。LOLHi arkascha,我正在测试您的代码,但不幸的是,输出仅包含[CODE]和[/CODE]标记之间的部分。缺少[CODE]-标记之外的所有内容。我做错了什么?@Christoph对不起,我不能同意你的说法。输出明显包含[CODE]之外的部分
标记。它在上面的答案中显示为输出的确切方式。但是,可能是您尝试使用html浏览器查看结果。在这种情况下,浏览器显然会解释外部html标记,因此它在字面意义上不可见。尝试使用var_dump()
而不是echo
语句,或者将输出包含在
标记中,或者在CLI上尝试代码。/yes,我通过使用-tags解决了这个问题。但是现在我遇到了一个问题,即函数只触发一次。事实上,[code]和[/code]之间的第一个元素被正确解析,第二个元素被忽略-(@Christoph:我不能同意这一点。我在上面发布的输出正是我执行代码时得到的结果。因此两者都包含[code]
节被正确替换,我只是再次检查,以确保。没有理由限制替换。在使用上述代码的方式上,肯定还有其他一些不同之处。