2012-09-29 56 views
1

我遇到一个奇怪的问题preg_replace。它似乎通常使用单个字符串,但是当我带一个大文本文件(〜1.5MB)时,它似乎什么都不做。preg_replace和大文本文件解析

我试图解析键值的一个大的文本文件,它具有这样的结构:

"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

您正在使用* s(PCRE_DOTALL)*修饰符,您应该了解它的第一手功能。不只是尝试和想知道,而且还有理解。 http://php.net/manual/en/reference.pcre.pattern.modifiers.php – hakre

+0

你也可能想将该文件格式转换成支持的东西,比如JSON或YAML。解析这些的库已经存在(但JSON没有评论)。 – hakre

回答

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

m改性剂改变输入文本的处理通过线对线

默认情况下,PCRE治疗受试者字符串作为由字符(即使它实际上包含一个单一的“线”的几条新线)。 “起始行”元字符(^)仅匹配字符串的开头,而“行尾”元字符($)仅匹配字符串末尾或终止换行符之前(除非设置了D修饰符)。这与Perl相同。当这个修饰符被设置时,“起始行”和“行结束”构造分别紧跟在主题字符串中的任何换行符之后或之前,以及在最开始和结束时匹配。这相当于Perl的/ m修饰符。如果主题字符串中没有“\ n”字符,或者模式中没有出现^或$,则设置此修饰符不起作用。

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

+0

而且'。'不匹配换行符,它使用* s(PCRE_DOTALL)*。 – hakre

+0

我不明白为什么 - 但我的问题是通过将文本文件中的所有文本复制到新文本并在新文本文件上运行代码来解决的......现在运行得很好(甚至没有实现在这里改变)。 – canadiancaper

+0

@canadiancaper:您当前的代码意味着:“从第一个”//“条目到文件尾部的所有内容” – zerkms

0

这看起来像JSON

你可以使用

json_decode($mydata,true) 

把你的整个文本文件转换成一个漂亮的多层次PHP数组。