preg_match一个编程字符串

时间:2014-07-11 09:18:04

标签: php regex

我想要的是一个匹配php字符串的正则表达式。这意味着""之间的所有内容,\"除外。直到现在我的表达一直是

/"([^\"]*)"/As

但那个不正确。例如,使用此字符串

"te\"st"

匹配"tes\,但匹配"te\"st"。我也试过这个:

/"([^\"].*)"/As

正确匹配上面的字符串,但当我有这个字符串"te\"st""时,它匹配"te\"st"",而它只匹配"te\"st"

任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:2)

这是你想要的正则表达式:

(?<!\\)"(?:\\\\|\\"|[^"\r\n])*+"

我可以让你变短,但它不会那么坚固。

the demo

<强>解释

  • negativelookbehind (?<!\\)声称前面的内容不是反斜杠
  • 匹配开头报价
  • (?:\\\\|\\"|[^"\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)

这个匹配它:

/"((?:.*?(?:\\")?)*)"/As

试试live

它的作用:

任意次,重复.*?和可选\"。所以它匹配所有可能的场景。