将PHP结束标记转换为注释

时间:2013-03-05 09:12:08

标签: php regex tags comments

我脚本中的一行包含字符串中的PHP结束标记。在正常操作下,这不会导致问题,但我需要注释掉该行。

我尝试使用///* */#注释掉这一行,但它们都不起作用,解析器认为结束标记是实际结束标签

以下是有问题的一行:

$string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i', '<br />', $string);
//                              ^^             ^^

我可以做些什么来评论上述内容?

6 个答案:

答案 0 :(得分:125)

使用技巧:从两个部分连接字符串。这样,结束标记被剪切为两个,并且不再是有效的结束标记。 '?>' --> '?'.'>'

在您的代码中:

$string = preg_replace('#<br\s*/?'.'>(?:\s*<br\s*/?'.'>)+#i', '<br />', $string);

这将使//条评论有效。

要使/* */条评论有效,您还必须拆分*/序列:

$string = preg_replace('#<br\s*'.'/?'.'>(?:\s*<br\s*'.'/?'.'>)+#i', '<br />', $string);

请记住,有时候,即使整体更多而不是其各部分的总和 - 但是贪婪是坏事,有时候你最好留下 less 。 :)

答案 1 :(得分:74)

最简单的方法

创建一个单独的变量来保存正则表达式;这样您就可以简单地注释掉preg_replace()语句:

$re = '#<br\s*/?>(?:\s*<br\s*/?>)+#i';
// $string = preg_replace($re, '<br />', $string);

修复使用字符类

要修复行注释,您可以通过将?>置于字符类中来解析>,如下所示:

$string = preg_replace('#<br\s*/?[>](?:\s*<br\s*/?[>])+#i', '<br />', $string);
                                 ^ ^              ^ ^

要修复阻止评论,您可以将其应用于/

$string = preg_replace('#<br\s*[/]?>(?:\s*<br\s*[/]?>)+#i', '<br />', $string);
                               ^ ^              ^ ^

要修复这两种评论样式,您可以将/ >放入自己的角色类中。

使用/x修饰符修复

x modifier - 又名PCRE_EXTENDED - 忽略正则表达式中的空格和换行符(除非它们出现在字符类中);这样就可以添加空格来分隔有问题的字符。修复两种评论样式:

$string = preg_replace('#<br\s* /? >(?:\s*<br\s* /? >)+#ix', '<br />', $string);
                               ^  ^             ^  ^

答案 2 :(得分:39)

为什么您的尝试无效:

// $string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i',...
                                   ^ doesn't work due to ?> ending php

/* $string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i',... */
                                 ^ doesn't work due to */ closing comment

什么有效:

/* $string = preg_replace('#<br\s*[/]?>(?:\s*<br\s*[/]?>)+#i',... */
                                  ^ ^              ^ ^
// $string = preg_replace('#<br\s*/?[>](?:\s*<br\s*/?[>])+#i',...
                                    ^ ^              ^ ^

<强>此外...

完成上述操作后,您应该可以使用/*注释掉该行。 如果您完全保留?>,则//无法注释掉整行。 ?>后面的文本可能是html,它在PHP解释器的控制之外,因此不起作用。

来自 the documentation:

  

“一行”评论样式仅对该行的结尾或   当前的PHP代码块,以先到者为准。这意味着   // ...&gt;之后的HTML代码或#...?&gt;将被打印:?&gt;爆发   PHP模式并返回到HTML模式,//或#不能影响   这一点。

答案 3 :(得分:16)

另一个想法:如果您想使用>评论,请退出/(以及/*...*/):

$string = preg_replace('#<br\s*\/?\>(?:\s*<br\s*\/?\>)+#i', '<br />', $string);

正则表达式引擎会忽略“不必要的”转义,但在这种情况下很有用(出于其他答案中概述的原因)。

答案 4 :(得分:11)

为什么要使用复杂,难以阅读的“技巧”来解决问题?

为方便起见,

?只是一个量词快捷键,所以

只需使用量词{0,1} 的长版本,即“最少0次出现最少1次”:

$string = preg_replace('#<br\s*/{0,1}>(?:\s*<br\s*/{0,1}>)+#i', '<br />', $string);

答案 5 :(得分:9)

其他一些值得添加到 RegEx技巧书的方法:

首先,您可以将您的RegEx压缩为:/(<br\s*/?>)+/i并替换为<br />(无需为RegExP带来前瞻性负担),您将始终以您选择的XHMTL换行符结束。

修改RegEx的其他方法,以便它不会发送*/结束评论或?>结束脚本:

  • 使用possessive quantifiers#(<br\s*+/?+>)+#i - 如果您发现空格匹配的数量与\s*+基本相同并保留,/?+如果您找到了斜线保持它!
  • \s*/*包含在捕获组中=&gt; #(<br(\s*)(/?)>)+#i

现场演示:http://codepad.viper-7.com/YjqUbi

由于我们倾向于占有行为,最快的RegEx也会绕过评论问题: #(<br\s*+/?+>)++#i explained demo


至于在棘手的情况下评论

当您无法更改代码或已使用多行注释时:

1。使用 nowdoc

    $string='Hello<br>World<br><br />World<br><br><br>Word!';
    <<<'comment'
    $string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
comment;

直播代码:http://codepad.viper-7.com/22uOtV

注意: nowdoc 类似于 heredoc ,但它不会解析内容,并且必须将{em>起始分隔符括在{ {1}}单引号'请注意结束分隔符不能被识别,必须后跟'新行< / strong>!

2。使用goto跳转代码:

;

实例:http://codepad.viper-7.com/UfqrIQ

3。使用$string='Hello<br>World<br><br />World<br><br><br>Word!'; goto landing; $string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string); landing: if(false)

跳过代码
if(0)

测试:http://codepad.viper-7.com/wDg5H5