preg_match_all和引号内的换行符

时间:2010-03-23 10:37:27

标签: php regex newline

另一个noob正则表达式问题/问题。我可能正在做些傻事,所以我想我会利用SO常客的一般聪明才智;)

尝试匹配换行符,但前提是它们出现在双引号或单引号内。我还想捕获引号之间但不包含换行符的字符串。

好的,这就是我得到的,输出。在那之下,将是我想得到的输出。任何帮助将不胜感激! :)

我使用Regex Coach来帮助我创建模式,成为新手和所有人。根据RC,我提供的模式确实匹配数据中的所有出现,但在我的PHP中,它跳过了多行部分。我已经尝试使用'm'模式修饰符,但无济于事。

$ CompressedData的内容:

<?php
$Var = "test";
$Var2 = "test2";
$Var3 = "blah blah
blah blah blah
blah blah blah blah";
$Var4 = "hello";
?>

模式/代码:

preg_match_all('!(\'|")(\b.*\b\n*)*(\'|")!', $CompressedData, $Matches);

$ Matches的当前print_r输出:

Array
(
    [0] => Array
        (
            [0] => "test"
            [1] => "test2"
            [2] => "hello"
        )
    ...
}

$ Matches的希望print_r输出:

Array
(
    [0] => Array
        (
            [0] => "test"
            [1] => "test2"
            [2] => "blah blah
blah blah blah
blah blah blah blah"
            [3] => "hello"
        )
    ...
}

2 个答案:

答案 0 :(得分:4)

m修饰符不会使点匹配换行符。这就是s修饰符的用途。除了字符串的开头/结尾外,m使^$匹配行的开头/结尾。

尝试/(\'|")((?:(?!\1).)*)\1/s

说明:

(\'|"):匹配单引号或双引号。请记住它在反引用\1中的哪一个。

(?:(?!\1).):匹配任何字符,只要它不是开头引号字符(在\1中)。

(...*):尽可能多地重复并在反引用\2中捕获匹配。

\1:匹配开头的引号字符。

答案 1 :(得分:1)

$str=<<<'EOF'
<?php
$Var = "test";
$Var2 = "test2";
$Var3 = "blah blah
blah blah blah
blah blah blah blah";
$Var4 = "hello";
?>
EOF;

$s = preg_replace('/<\?php|\?>/sm',"",$str);
$s = preg_split("/.*=/",$s);
print_r($s);