正则表达式,除引号之间的文本外,还能识别所有内容

时间:2013-10-21 21:05:49

标签: php regex

我需要制作一个正则表达式来识别除引号之间的文本之外的所有内容。 这是一个例子:

my_var == "Hello world!"

我想获得my_var但不是Hello world!

我试过了(?<!\")([A-Za-z0-9]+),但它没有用。

4 个答案:

答案 0 :(得分:2)

如果你想花时间到google或搜索stackoverflow,你会发现这个问题的答案不仅仅是我,还有很多其他用户已经回答过。

使用 negative lookbehind

@Pappa's回答只会匹配一个简单的测试用例,而不是匹配未用引号括起来的字符串中的所有内容。在这种情况下,如果您想要匹配任何给定数据中的所有单词字符,我就足够了 negative lookahead

/[\w.-]+(?![^"]*"(?:(?:[^"]*"){2})*[^"]*$)/

请参阅live demo

示例:

<?php

$text = <<<T
my_var == "Hello world!" foo /(^*#&^$ 
"hello" foobar "hello" FOO "hello" baz
Hi foo, I said "hello" $&@^$(@$)@$&*@(*$&
T;

preg_match_all('/[\w.-]+(?![^"]*"(?:(?:[^"]*"){2})*[^"]*$)/', $text, $matches);
print_r($matches);

输出

Array
(
     [0] => Array
        (
            [0] => my_var
            [1] => foo
            [2] => foobar
            [3] => FOO
            [4] => baz
            [5] => Hi
            [6] => foo
            [7] => I
            [8] => said
        )
)

答案 1 :(得分:2)

你有一个接受的答案,但我仍然提交一次,因为我相信这个答案更能抓住更多边缘案例:

$s = 'my_var == "Hello world!" foo';
if (preg_match_all('/[\w.-]+(?=(?:(?:[^"]*"){2})*[^"]*$)/', $s, $arr))
   print_r($arr[0]);

<强>输出:

Array
(
    [0] => my_var
    [1] => foo
)

这可以通过使用前瞻来确保甚至遵循双引号#(需要平衡双引号并且没有转义)。

答案 2 :(得分:1)

尽管我很遗憾因为回答此问题而感到沮丧,但我还是很感兴趣,所以无论如何都是这样。

(?<![" a-zA-Z])([A-Za-z0-9\-_\.]+)

答案 3 :(得分:0)

没有提到这个简单的解决方案(见demo):

"[^"]*"(*SKIP)(*F)|[\w.-]+

参考

How to match pattern except in situations s1, s2, s3