我很难在双引号中删除文本,特别是那些分布在多行中的文本:
$file=file_get_contents('test.html');
$replaced = preg_replace('/"(\n.)+?"/m','', $file);
我想删除双引号内的所有文字(包括在内)。其中的一些文本将分布在多行中。
我看到换行符也可以是\r\n
和\n
。
答案 0 :(得分:6)
试试这个表达式:
"[^"]+"
另外请确保全局替换(通常使用g
标记 - 我的PHP生锈,请查看文档。)
答案 1 :(得分:2)
另一个编辑:daalbert的解决方案是最好的:引用后跟一个或多个以引号结尾的非引号。
如果您正在解析HTML,我会做一点修改:将其设为0或更多非引号字符...所以正则表达式将是:
"[^"]*"
编辑:
第二个想法,这是一个更好的:
"[\S\s]*?"
这说:“引用后跟非空白字符或空白字符的任意次数,非贪婪,以引号结尾”
下面的那个在没有必要的时候使用捕获组......并且这里使用通配符并不明确表示通配符匹配除了换行符之外的所有内容...所以说得更清楚:“要么是非空白字符,要么是空白字符”:) - 而不是它对结果产生任何影响。
有很多正则表达式可以解决你的问题,但这里有一个:
"(.*?(\s)*?)*?"
这读作:
找到一个引号,可选地后跟:(任意数量的字符不是非贪婪的新行字符,后面是非贪婪的任意数量的空白字符),非贪婪地重复任意次数
贪婪意味着它会到达字符串的末尾并尝试匹配它。如果它找不到匹配,则从最后开始并尝试匹配,依此类推。所以非贪婪意味着它会找到尽可能少的字符来尝试匹配标准。
关于正则表达式的绝佳链接:http://www.regular-expressions.info
测试正则表达式的绝佳链接:http://regexpal.com/
请记住,根据您使用正则表达式搜索的语言,您的正则表达式可能需要稍微更改。
答案 2 :(得分:0)
您可以使用单线模式(也称为dotall),点甚至可以匹配换行符(无论它们是什么):
/".+?"/s
您正在使用多行模式,它只是将^
和$
的含义从字符串的开头/结尾更改为文本的开头/结尾。你在这里不需要它。
答案 3 :(得分:0)
"[^"]+"
答案 4 :(得分:0)
如下所示。 s
是dotall
模式,其中.
甚至可以与换行符匹配:
/".+?"/s
答案 5 :(得分:0)
$replaced = preg_replace('/"[^"]*"/s','', $file);
会为你做这件事。不过请注意,它不允许使用任何带引号的双引号(例如A "test \" quoted string" B
会导致A quoted string" B
带有前导空格,而不会出现A B
,如您所料。