Еще одна проблема / вопрос regex noob. Я, наверное, делаю что-то глупое, поэтому я думал, что буду использовать общую изобретательность постоянных членов SO;)
Попытка сопоставить символы новой строки, но только в случае двойных кавычек или одинарных кавычек. Я также хочу поймать строки, которые находятся между кавычками, но не содержат новых строк.
Ладно, вот что я получил, с выходом. Ниже этого будет выход, который я хотел бы получить. Любая помощь будет принята с благодарностью! 🙂
Я использую Regex Coach, чтобы помочь мне создать мои шаблоны, будучи новичком и всеми. По словам RC, предложение I типа соответствует всем событиям в данных, но на моем 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 из $ Матчи:
Array ( [0] => Array ( [0] => "test" [1] => "test2" [2] => "hello" ) ... }
DESIRED print_r выход $ Матчи:
Array ( [0] => Array ( [0] => "test" [1] => "test2" [2] => "blah blah blah blah blah blah blah blah blah" [3] => "hello" ) ... }
Модификатор m
не делает совпадение точек совпадающими. Вот для чего нужен s
модификатор. m
создает начало и конец строки ^
и $
в дополнение к началу / концу строки.
Попробуйте /(\'|")((?:(?!\1).)*)\1/s
Объяснение:
(\'|")
: Сопоставить одну или двойную кавычку. Помните, какой из них был в backreference \1
.
(?:(?!\1).)
: Сопоставьте любой символ, если он не является символом открытия (в \1
).
(...*)
: Повторяйте как можно чаще и фиксируйте совпадение в backreference \2
.
\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);