Autor Zpráva
Grivenko
Profil
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
Nejspíše pomůže http://cz2.php.net/preg_quote
Grivenko
Profil
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
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: