Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:仅在定义的标记之间使用htmlspecialchars_Php_Regex_Preg Replace_Preg Match - Fatal编程技术网

PHP:仅在定义的标记之间使用htmlspecialchars

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

我在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 meet you!</strong>[/CODE]</div>
         </body>
         </html>';
$str='1〕
[代码]你好,世界[/CODE]
[CODE]很高兴认识您[/CODE]
';
现在我想解析字符串并使用htmlspecialchars,但只在标记[CODE]和[/CODE]中使用。应忽略标记之外的所有标记

结果应该是:

$str = ' [...] <div id="box1">&lt;span class="test"&gt;Hello World&lt;/span&gt;</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">&lt;span class=&quot;test&quot;&gt;Hello 
         [CODE] World&lt;/span&gt;</div>
         <div id="box2">&lt;strong class=&quot;test2&quot;&gt;Nice to meet you!&lt;/strong&gt;</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">&lt;span class=&quot;test&quot;&gt;Hello 
         [CODE] World&lt;/span&gt;</div>
         <div id="box2">&lt;strong class=&quot;test2&quot;&gt;Nice to meet you!&lt;/strong&gt;</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]
节被正确替换,我只是再次检查,以确保。没有理由限制替换。在使用上述代码的方式上,肯定还有其他一些不同之处。