3 回答
TA贡献1829条经验 获得超13个赞
对于大多数字符串,您需要允许转义任何内容(而不仅仅是转义引号)。例如,你很可能需要允许转义字符像"\n"和"\t"当然,转义逃逸:"\\"。
这是一个经常问到的问题,很早以前就已经解决(并优化)了。杰弗里·弗里德尔(Jeffrey Friedl)在他的经典著作《精通正则表达式》(第3版)中深入探讨了这个问题(例如)。这是您要查找的正则表达式:
好:
"([^"\\]|\\.)*"
版本1:工作正常,但效率不高。
更好:
"([^"\\]++|\\.)*"或"((?>[^"\\]+)|\\.)*"
版本2:如果您拥有所有格限定词或原子组,则效率更高(请参阅:使用原子组方法的sin的正确答案)。
最好:
"[^"\\]*(?:\\.[^"\\]*)*"
版本3:效率更高。实现Friedl的“展开循环”技术。不需要所有格或原子组(即可以在Javascript和其他功能较少的正则表达式引擎中使用。)
这是PHP语法中针对双引号和单引号子字符串的推荐正则表达式:
$re_dq = '/"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"/s';
$re_sq = "/'[^'\\\\]*(?:\\\\.[^'\\\\]*)*'/s";
TA贡献1827条经验 获得超9个赞
尝试这样的正则表达式:
'/"(\\\\[\\\\"]|[^\\\\"])*"/'
(简短)说明:
" # match a `"`
( # open group 1
\\\\[\\\\"] # match either `\\` or `\"`
| # OR
[^\\\\"] # match any char other than `\` and `"`
)* # close group 1, and repeat it zero or more times
" # match a `"`
以下代码段:
<?php
$text = 'abc "string \\\\ \\" literal" def';
preg_match_all('/"(\\\\[\\\\"]|[^\\\\"])*"/', $text, $matches);
echo $text . "\n";
print_r($matches);
?>
生产:
abc "string \\ \" literal" def
Array
(
[0] => Array
(
[0] => "string \\ \" literal"
)
[1] => Array
(
[0] => l
)
)
正如您在Ideone上看到的那样。
- 3 回答
- 0 关注
- 821 浏览
添加回答
举报