Ahojte, nejsem zběhlý v regulárních výrazech a přesto se snažím napsat, těžký regulární výraz (podle některých dokonce téměř nemožný, takže jestli tomu tak opravdu je, neváhejte mi to říct znovu - uvítal bych i důvod :smile1: ). Jak je zřejmé z titulku vlákna, snažím se napsat regulární výraz na rozpoznání heredoc stringu. Začínám se syntaxí bez uvozovek. Úspěšně jsem "matchnul" identifikátor heredocu, ale nějak nerozumím, proč mi špatně funguje ta druhá část, můžete mi, prosím, vysvětlit, proč to funguje špatně?
// první část - identifikátor (funguje ok)
$idName = '/<<<([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[\r\n|\r|\n]';
// zbytek vzoru - vše mezi <<<IDENTIFIKATOR a IDENTIFIKATOR;\n
$patternRest = '(.*(?=\1);?[\r\n|\r|\n])?/s';
// celý vzor je pak spojení těchto dvou řetězců
$pattern = $idName . $patternRest;
Tento regulární výraz bohužel funguje jen částečně. Zkouším to na následujícím příkladu$text = <<<HEREDOC
\$test = <<<EOT\ncokoliv \n i na vice radku\nhaha\nEOT\n\n
\$test2 = <<<EOT\ncokoliv \n i na vice radku\nhaha 2\nEOT;\n
HEREDOC;
Po zavolání funkce preg_match_all najde správně oba ty řetězce, ale... funguje to např. i když přidám za středník cokoliv jiného, než nový řádek. Proč? Vždyť ve vzoru pro regulární výraz mám// mělo by znamenat - za identifikátorem může a nemusí být středník
// a hned za tím nový řádek, nebo neznamena?
(?=\1);?[\r\n|\r|\n]
Mockrát děkuji za pomoc :-)