1

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

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

4

2 回答 2

3
$filecontent = preg_replace('!//.*$!m', '', $filecontent);

m修饰符将输入文本的处理更改为逐行

默认情况下,PCRE 将主题字符串视为由单个“行”字符组成(即使它实际上包含多个换行符)。“行首”元字符 (^) 仅匹配字符串的开头,而“行尾”元字符 ($) 仅匹配字符串末尾或终止换行符之前(除非设置了 D 修饰符)。这与 Perl 相同。设置此修饰符时,“行首”和“行尾”构造分别匹配主题字符串中任何换行符之后或之前的任何换行符,以及开头和结尾处。这相当于 Perl 的 /m 修饰符。如果主题字符串中没有“\n”字符,或者模式中没有出现 ^ 或 $,则设置此修饰符无效。

http://php.net/manual/en/reference.pcre.pattern.modifiers.php

于 2012-09-29T07:58:33.453 回答
0

这看起来像JSON

你能用吗

json_decode($mydata,true) 

把你的整个文本文件变成一个漂亮的多级 php 数组。

于 2012-09-29T08:24:36.770 回答