我想要的是一个匹配php字符串的正则表达式。这意味着"
和"
之间的所有内容,\"
除外。直到现在我的表达一直是
/"([^\"]*)"/As
但那个不正确。例如,使用此字符串
"te\"st"
匹配"tes\
,但匹配"te\"st"
。我也试过这个:
/"([^\"].*)"/As
正确匹配上面的字符串,但当我有这个字符串"te\"st""
时,它匹配"te\"st""
,而它只匹配"te\"st"
任何帮助表示赞赏!
答案 0 :(得分:2)
这是你想要的正则表达式:
(?<!\\)"(?:\\\\|\\"|[^"\r\n])*+"
我可以让你变短,但它不会那么坚固。
见the demo。
<强>解释强>
(?<!\\)
声称前面的内容不是反斜杠(?:\\\\|\\"|[^"\r\n])
匹配双反斜杠,转义引号\"
或任何非引号和换行符的字符(假设一行上有字符串;否则取出\r\n
)< / LI>
*
重复零次或多次,+
阻止回溯"
与结束报价相匹配使用它:
$regex = '/(?<!\\\\)"(?:\\\\\\\\|\\\\"|[^"\r\n])*+"/';
if (preg_match($regex, $yourstring, $m)) {
$thematch = $m[0];
}
else { // no match...
}
答案 1 :(得分:1)
您可以使用此模式:
/\A"(?>[^"\\]+|\\.)*"/s
在PHP代码中你必须写:
$pattern = '/\A"(?>[^"\\\]+|\\\.)*"/s';
模式细节:
\A # anchor for the start of the string
"
(?> # open an atomic group (a group once closed can't give back characters)
[^"\\]+ # all characters except quotes and backslashes one or more times
|
\\. # an escaped character
)*
"
/s singleline mode (the dot can match newlines too)
答案 2 :(得分:0)