我脚本中的一行包含字符串中的PHP结束标记。在正常操作下,这不会导致问题,但我需要注释掉该行。
我尝试使用//
,/*
*/
和#
注释掉这一行,但它们都不起作用,解析器认为结束标记是实际结束标签
以下是有问题的一行:
$string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i', '<br />', $string);
// ^^ ^^
我可以做些什么来评论上述内容?
答案 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解释器的控制之外,因此不起作用。
“一行”评论样式仅对该行的结尾或 当前的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的其他方法,以便它不会发送*/
结束评论或?>
结束脚本:
#(<br\s*+/?+>)+#i
- 如果您发现空格匹配的数量与\s*+
基本相同并保留,/?+
如果您找到了斜线保持它!\s*
和/*
包含在捕获组中=&gt; #(<br(\s*)(/?)>)+#i
现场演示:http://codepad.viper-7.com/YjqUbi
由于我们倾向于占有行为,最快的RegEx也会绕过评论问题: #(<br\s*+/?+>)++#i
explained demo
当您无法更改代码或已使用多行注释时:
$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>!)
;
实例:http://codepad.viper-7.com/UfqrIQ
$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)