regex:删除“”中的所有文本;双引号";(包括多行)


regex: remove all text within "double-quotes" (multiline included)

我很难删除双引号内的文本,尤其是那些分布在多行的文本:

$file=file_get_contents('test.html');
$replaced = preg_replace('/"('n.)+?"/m','', $file);

我想删除双引号内的所有文本(包括在内)。其中的一些文本将分布在多行中。

我读到换行符也可以是'r'n'n

试试这个表达式:

"[^"]+"

还要确保全局替换(通常使用g标志-我的PHP已经过时,所以请检查文档)。

另一个编辑:daalbert的解决方案是最好的:一个引号后面跟着一个或多个以引号结尾的非引号。

如果你正在解析HTML,我会做一个小小的修改:使其为0个或更多的非引号字符。。。因此正则表达式将为:

"[^"]*"

编辑:

转念一想,这里有一个更好的:

"['S's]*?"

上面写着:"一个引号后面跟着一个非空白字符或空白字符任意次数,非贪婪地,以引号结尾"

下面的一个在不需要的时候使用捕获组。。。这里使用通配符并不是为了明确显示通配符匹配除换行符之外的所有字符。。。因此,更清楚的说法是:"要么是非空白字符,要么是空白字符":)——这并不是说它会对结果产生任何影响。


有很多正则表达式可以解决您的问题,但这里有一个:

"(.*?('s)*?)*?"

这读作:

找到一个引号,可选地后跟:(任意数量的非换行字符,然后非贪婪地后跟任意数量的空白字符),非贪婪地重复任意次数

贪婪意味着它会走到字符串的末尾并尝试匹配它。如果找不到匹配项,它会从末尾开始一个字符并尝试匹配,以此类推。所以非贪婪意味着他会找到尽可能少的字符来尝试匹配条件。

regex上的伟大链接:http://www.regular-expressions.info
测试正则表达式的伟大链接:http://regexpal.com/

请记住,您的正则表达式可能需要根据您使用的语言略有更改才能使用正则表达式进行搜索。

您可以使用单行模式(也称为dotall),点甚至可以匹配换行符(无论它们是什么):

/".+?"/s

您使用的是多行模式,它只需将^$的含义从字符串的开头/结尾更改为文本的开头/末尾。你在这里不需要它。

"[^"]+"

如下所示。.A "test '" quoted string" B模式,其中A quoted string" B将与换行符匹配

/".+?"/s
$replaced = preg_replace('/"[^"]*"/s','', $file);

会为你做这件事。但是,请注意,它不允许任何带引号的双引号(例如,A B将导致CCD_14带有前导空格,而不是您所期望的CCD_15。