tags:

views:

24

answers:

2

Another noob regex problem/question. I'm probably doing something silly so I thought I'd exploit the general ingenuity of the SO regulars ;)

Trying to match newlines but only if they occur within either double quotes or single quotes. I also want to catch strings that are between quotes but contain no newlines.

Okay so there's what i got, with output. Below that, will be the output I would like to get. Any help would be greatly appreciated! :)

I use Regex Coach to help me create my patterns, being a novice and all. According to RC, The pattern I supply does match all occurances within the data, but in my PHP, it skips over the multi-line part. I have tried with the 'm' pattern modifier already, to no avail.

Contents of $CompressedData:

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

Pattern / Code:

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

Current print_r output of $Matches:

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

DESIRED print_r output of $Matches:

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

The m modifier does not make the dot match newlines. That's what the s modifier is for. m makes ^ and $ match start/end of lines in addition to start/end of string.

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

Explanation:

(\'|"): Match a single or double quote. Remember which one it was in backreference \1.

(?:(?!\1).): Match any character as long as it's not the opening quote character (in \1).

(...*): Repeat as often as possible and capture the match in backreference \2.

\1: Match the opening quote character.

Tim Pietzcker
Ah, thank you for the explanation :) I did try the s modifier too, but somehow it didn't seem to help either, likely due to something else failing with my pattern. Yours works perfectly, in fact far better than mine thanks to the backreference - i didn't even think of that! :)
David
A: 
$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);
ghostdog74