preg_replace和大文本文件解析

时间:2012-09-29 07:56:10

标签: php regex parsing preg-replace

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电话都不会做任何事情(或我的正则表达式已关闭)。

一个明显的解决方案就是忽略解析中的注释,但我认为必须有一些我在这里缺少的东西,为什么这不起作用。如果可能的话,我真的想在不改变解析器的情况下解决这个问题。有什么想法吗?

2 个答案:

答案 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)

这看起来像JSON

你能用吗

json_decode($mydata,true) 

将整个文本文件转换为一个漂亮的多级php数组。