【发布时间】:2011-07-29 09:50:50
【问题描述】:
我必须解析包含不同类型 cmets 的各种文件。我一直在尝试找出一种简单的方法来去除这些 cmets,但到目前为止还没有什么好处。我有以 # 和 ; 开头的全行 cmets以及在相关数据之后启动的 cmets。最好的例子:
data
data
#comment
;comment
data ;comment
data #comment
对剥离这些 cmets 有什么帮助吗?也许还有空行?
【问题讨论】:
标签: php
我必须解析包含不同类型 cmets 的各种文件。我一直在尝试找出一种简单的方法来去除这些 cmets,但到目前为止还没有什么好处。我有以 # 和 ; 开头的全行 cmets以及在相关数据之后启动的 cmets。最好的例子:
data
data
#comment
;comment
data ;comment
data #comment
对剥离这些 cmets 有什么帮助吗?也许还有空行?
【问题讨论】:
标签: php
$t = ltrim(preg_replace('/\s*[#;].*$/m', '', $t));
应该可以。删除所有 cmets,确保不要在 cmets 曾经所在的位置留下任何空白行。还会在 cmets 之前杀死空格,但如果您不希望这样做,可以更改(\s 到 \n)。
编辑:刚刚看到关于删除空行的注释。以下内容应同时删除 cmets 和空行:
$t = ltrim(preg_replace('/(\s*[#;].*$)|(^\s*)/m', '', $t));
未经测试,但第二个条件应捕获空白(仅空白)行。 ltrim 仍然需要删除前导注释可能导致的任何空白。可能可以将其作为正则表达式的一部分来捕获,但我认为使用 ltrim 时它不那么复杂。
再次编辑:实际上上面的内容会删除每行上的所有前导空格。如果这是一个问题,您可以通过以下方式解决它:
$t = ltrim(preg_replace('/(\s*[#;].*$)|(^\s*\n)/m', '', $t));
【讨论】:
这应该可以工作 (live demo):
echo preg_replace(
'/
[;#] # remove strings starting with ; or #
.* # and everything following that
$ # until it ends in a newline
/mx', // make it span multilines
'',
$data
);
以上内容将在全行 cmets 所在的位置留下空白行。如果您也想替换它们,请在第一个 [;#] 之前添加\s(如下面的@konforce 所示)。
【讨论】: