Regularni vyraz na heredoc – PHP – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Regularni vyraz na heredoc – PHP – Fórum – Programujte.comRegularni vyraz na heredoc – PHP – Fórum – Programujte.com

 

BigBear0
Stálý člen
28. 4. 2011   #1
-
0
-

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 :-)

Nahlásit jako SPAM
IP: 94.74.255.–
NECIN DRUHYM TO, CO NECHCES, ABY ONI CINILI TOBE!
BigBear0
Stálý člen
28. 4. 2011   #2
-
0
-

To BigBear :
Tak už jsem si s tím poradil. Bylo skoro zbytečné to sem psát, ale já na to nemohl přijít hodně dlouhou dobu, tak jsem to napsal a pak mi to došlo ;-).

// správný vzor, který to provede tak, jak má

$pattern1 = '/<<<([a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)[\r\n|\r|\n](.*(?=\1))?\1;?[\r\n|\r|\n]/s';
Ona konstrukce (?=\1) totiž jen říká, že na konci toho .* musí být identifikátor a nebere ho jako součást řetězce. Je tudíž potřeba tam identifikátor přidat a za něj teprve středník a nový řádek :-)

Nahlásit jako SPAM
IP: 94.74.255.–
NECIN DRUHYM TO, CO NECHCES, ABY ONI CINILI TOBE!
nervak0
Věrný člen
29. 4. 2011   #3
-
0
-

správný vzor, který to provede tak, jak má

funkční

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

Podobná vlákna

Regulární výraz — založil Pilot

Regularni vyraz — založil don_Dominique

Regulární výraz v c# — založil attila

Regulární výraz. — založil Paja2

Regulární výraz — založil Proxymus

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý