Autor Zpráva
Laal
Profil *
Zdravím,

řeším tu zapeklitý problém a nějak nemůžu přijít na to, jak se s tím poprat,aby to bylo funkční. Jde o to, že jsem si napsal fórum s vlastními BB tagy - tohle funguje dobře. Značky se přepisují pomocí fce preg_replace(), ale já bych u některých těch tagů potřeboval, aby prošly kontrolou s DB. Dejme tomu, že budu mít značku aut [auto]Opel[/auto] a já ho budu chtít porovnat s databází, jestli se v ní tahle značka nachází. Pokud ano, hodí mi to odkaz podle definice té značky, pokud ne, stane se z toho pouhý text. Něco takového se už povedlo, jenže to funguje jen na jednu značku, která se pak kopíruje do všech ostatních. Nemůžu přijít na to, jak to vymyslet, aby to fungovalo. Tady je ukázka kódu:

$hledam = array(
        "/\[auto\](.+?)\[\/auto\]/is");

//tady nasleduje nejaky PHP kod a SELECT pro porovnani s DB

$nahrazuji = array(
        "<a href=\"auta.php..........\">$1</a>");

$txt=preg_replace($hledam,$nahrazuji,$txt);



Hodně jsem to zkrátil, aby tu zbytečně nestrašil dlouhý kód, který je k ničemu, ale zajímalo by mě, jak dosáhnout toho, aby se ta kontrola prováděla pokaždé, když funkce nahrazuje danou značku. Takhle, jak to mám se (aspoň mi to přijde) provede jen jednou a nahradí všechny značky tím prvním výsledkem.Zkoušel jsem to i házet do cyklů a dosáhl jsem stejných výsledků. Nemáte někdo nějaký nápad? Moc by mi to pomohlo...Předem díky
Laal
Profil *
Teď když nad tím přemýšlím, nešlo by do
$nahrazuji = array(
        "<a href=\"auta.php..........\">$1</a>");


hodit nějakou funkci, třeba
$nahrazuji = array(
        "<a href=\"auta.php..........\">".hledejvdb($1)."</a>");


a ono by to mohlo tu funkci vykonat vždy až přímo u výpisu... To by snad mělo fungovat, ne? Asi už na starý kolena blbnu :-D
Laal
Profil *
Tak beru zpět, tohle nefunguje.... Jiný návrh?
AM
Profil *
Nějak moc nechápu, jak by to mohlo fungovat; přece název toho auta (a odkaz na něj) můžeš vytvořit až ve chvíli, kdy ho vyhledáš? nemůžeš si předem připravit, co se bude přes preg_replace dosazovat, to zjistíš až ve chvíli, kdy se setkáš s prvním výskytem. Proto možná použij raději preg_replace_callback($hledam, 'moje_callback_funkce', $text); a nadefinuj:
moje_callback_funkce($matches){ //$matches obsahuje shody s regularnim vyrazem
$auto = hledej_auto($matches[1]); //rekneme ze tahle funkce vrati true, pokud je auto v databazi, a false, pokud neni
if ($auto) {
return "<a href=\"auta.php?auto=${matches[1]}\">${matches[1]}</a>";
} else {
return ${matches[1]};
}
}
Laal
Profil *
Díky, na tuhle funkci jsem už taky narazil a zkouším to, ale zatím nějak nevím, jak to správně poskládat... Hraju si s tím, ale zatím bezvýsledně. Nemohl by mi to někdo ochotný tak nějak zevrubně "načrtnout"? Stačí jen tak nějak, jak to mám já. Dneska mi to nějak nemyslí a potřeboval bych s tím pohnout :(
tiso
Profil
Laal $1 - premenné nesmú začínať číslom!
Jediná reálna možnosť je vybrať si z DB všetky autá a poskladať si tie polia $hledam a $nahrazuji:
$hledam=$nahrazuji=array();
$query="SELECT auto, url FROM auta";
$result=mysql_query($query)
while($row=mysql_fetch_assoc($result){
  $hledam[]='[auto]'.$row['auto'].'[/auto]';
  $nahrazuji[]='<a href="'.$row['url'].'">'.$row['auto'].'</a>';
}
Laal
Profil *
tiso:

díky za radu, ale tohle právě nechci... s preg_replace_callback() už jsem na výsledek přišel, i když to budu potřebovat ještě trošku doladit. Je to přesně to, co jsem chtěl a funguje to skvěle.

Díky tedy všem za radu a hlavně za tu preg_replace_callback() funkci, tu jsem neznal :)

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: