Autor | Zpráva | ||
---|---|---|---|
Grivenko Profil |
#1 · Zasláno: 9. 3. 2014, 21:50:44
Přeji dobrý večer.
mám takový problém s preg_match_all... $input = " {PRIHLASEN} <p>Jste přihlášen jako (USERNAME).</p> {/PRIHLASEN} {NEPRIHLASEN} <form action="./?page=login" method="post"> .... </form> {/NEPRIHLASEN} "; Můj web si načte html šablonu (viz. výše část šablony) a potom hledá funkce které v šabloně jsou zapsány jako {FUNKCE}cokoliv{/FUNKCE}. K tomu používám následující funkci: preg_match_all('~\{(.*?)\}(.*?)\{/(.*?)\}~s', $input, $out, PREG_SET_ORDER); zjistí o jakou funkci se jedná , skočí na ni a až projede tam vrací hodnoty, ale to není podstatné, to mi funguje jak má. Problém nastává tehdy, kdy je ve funkci "?" či jakýkoliv znak, který se používá v regulárních výrazech jako je třeba v ukázce formulář který se ukáže pokud je uživatel nepřihlášen. Potřeboval bych jestli nějak jde aby si (.*?) automaticky tyto znaky escapoval pokud to lze. Regulární výrazy nejsou má silná stránka, tak prosím negativní komentáře si prosím nechejte pro sebe. Díky všem předem... |
||
Kcko Profil |
#2 · Zasláno: 9. 3. 2014, 21:56:46
Nejspíše pomůže http://cz2.php.net/preg_quote
|
||
Grivenko Profil |
#3 · Zasláno: 9. 3. 2014, 22:40:09
No tak jsem to zkusil a bohužel jsem neuspěl .
když použiji preg_quote, eskejpne mi to i html tagy , což potom v konečném výsledku dělá bordel. Zkoušel jsem i escapovat pouze "?" a to přes addcslashes() a to mi fungovalo (eskejpovalo to jen ?) ale i tak mi to nesebral, a pořád mu vadí i když je eskejpnutý. Už si s tím nevím rady. // Tak jsem jeden způsob vymyslel... $input = str_replace("?", "vykricnikfnc", $input); preg_match_all('~\{(.*?)\}(.*?)\{/(.*?)\}~s', $input, $out, PREG_SET_ORDER); ... $input = str_replace("vykricnikfnc", "?", $input); return $input; Je to zajímavý způsob , ale funguje. Takže téma je vyřešeno. |
||
juriad Profil |
#4 · Zasláno: 9. 3. 2014, 23:22:50
Já nějak vůbec nechápu v čem je problém. Regulárním výrazům vůbec nevadí znak otazník (ani jiný znak) v prohledávaném textu.
Nejspíš se dopouštíš nějaké nepatřičnosti v jiném regulárním výrazu, který skládáš z výsledků toho uvedeného. V takovém případě je řešení [#2] od Kcka správně. |
||
Grivenko Profil |
#5 · Zasláno: 10. 3. 2014, 17:27:18
No je to pravda, už jsem na to také došel. Nakonec jsem zjistil, po tom co jsem si vypsal celé pole co z preg_match_all leze, že ho sebere. Problém byl až v další čísti kde to nahrazoval podle toho co zjistil. Pro ukázku sem dám zjednodušený část té funkce ( bez různých kontrol které nejsou podstatné a nevztahují se k problému)
$vstup = " {LOGGED} <form action=\"./?page=login\" method=\"post\"> <input type=\"text\" /> </form> {/LOGGED} "; function rep_functions($input){ $LOGGED = true; preg_match_all('~\{(.*?)\}(.*?)\{/(.*?)\}~s', $input, $out, PREG_SET_ORDER); //print_r($out); foreach($out as $value){ if($value[1] == "LOGGED"){ if($LOGGED){ $input = preg_replace('~\{LOGGED\}'.$value[2].'\{/LOGGED\}~si', $value[2], $input); }else{ $input = preg_replace('~\{LOGGED\}'.$value[2].'\{/LOGGED\}~si', "", $input); } } } return $input; } echo rep_functions($vstup); nelíbí se to funkci preg_replace() ale tam už to bylo jednoduché vyřešit s pomocí předchozího příspěvku ( Tím uživateli "Kcka" děkuji)... $input = preg_replace('~\{LOGGED\}'.preg_quote($value[2]).'\{/LOGGED\}~si', $value[2], $input); Tak to od té doby mám a funguje mi to . Děkuji všem za pomoc. |
||
Časová prodleva: 10 let
|
0