preg_match_all и переводы строк в кавычки - PullRequest
2 голосов
/ 23 марта 2010

Еще одна проблема / вопрос о регулярных выражениях 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);

Текущийвывод print_r из $ Matches:

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

DESIRED вывод print_r из $ Matches:

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

Ответы [ 2 ]

4 голосов
/ 23 марта 2010

Модификатор m не делает точку новой строкой. Вот для чего нужен модификатор s. m делает ^ и $ совпадением начала / конца строк в дополнение к началу / концу строки.

Попробуйте /(\'|")((?:(?!\1).)*)\1/s

Пояснение:

(\'|"): соответствует одинарной или двойной кавычке. Помните, какой это был в обратной ссылке \1.

(?:(?!\1).): сопоставить любой символ, если он не является символом открывающей кавычки (в \1).

(...*): повторять как можно чаще и фиксировать совпадение в обратной ссылке \2.

\1: соответствует символу открывающей кавычки.

1 голос
/ 23 марта 2010
$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);
...