preg_replace
我遇到了一个奇怪的问题。它看起来像单个字符串一样正常,但是当我带一个大文本文件(~1.5MB)时,似乎什么都不做。
我正在尝试解析具有这种结构的键值的大型文本文件:
"KeyValues"
{
"Key1" "Value1"
// a comment
"ComplexKey"
{
"ComplexKey1" "ComplexValue1" // another comment
"ComplexKey2" "ComplexValue2"
"FurtherComplexity1"
{
"ComplexKey3" "ComplexValue3"
"ComplexKey4" "ComplexValue4"
}
}
}
我正在尝试在进行任何解析之前从文本文件中删除注释。 preg_replace
似乎是一个安全的赌注。这是删除评论的代码:
<?php
$filecontent = file_get_contents('file.txt');
$filecontent = preg_replace('!//.*!s', '', $filecontent);
echo $filecontent;
?>
现在我希望它在没有注释的情况下输出上面的例子,但它只返回它开始时完全相同的字符串。虽然它变得奇怪但我从文本文件中取出一行,例如这一行:
"ComplexKey1" "ComplexValue1" // another comment
我可以对该字符串运行preg_replace
调用,它将返回没有注释的字符串。我想也许是因为有些新行字符与正则表达式不匹配,所以我在表达式中添加了's'修饰符;但是,这似乎没有解决问题。无论出于何种原因,我的preg_replace
电话都不会做任何事情(或我的正则表达式已关闭)。
一个明显的解决方案就是忽略解析中的注释,但我认为必须有一些我在这里缺少的东西,为什么这不起作用。如果可能的话,我真的想在不改变解析器的情况下解决这个问题。有什么想法吗?
答案 0 :(得分:3)
$filecontent = preg_replace('!//.*$!m', '', $filecontent);
m
修饰符将输入文本的处理逐行更改为
默认情况下,PCRE将主题字符串视为由单个“行”字符组成(即使它实际上包含多个换行符)。 “行首”元字符(^)仅匹配字符串的开头,而“行尾”元字符($)仅匹配字符串的结尾或终止换行符之前(除非设置了D修饰符) )。这与Perl相同。设置此修饰符时,“行首”和“行尾”构造分别在主题字符串中的任何换行符之后或之前立即匹配,以及在开头和结尾处匹配。这相当于Perl的/ m修饰符。如果主题字符串中没有“\ n”字符,或者模式中没有出现^或$,则设置此修饰符无效。
http://php.net/manual/en/reference.pcre.pattern.modifiers.php
答案 1 :(得分:0)