Autor Zpráva
Dinococcus
Profil
Čaute,
chcel by som si na svojom webe spraviť taký inteligentný hyperlinkovací systém, ktorý by predtým, ako ponúkne klikateľný odkaz v článku skontroloval, či jeho cieľ (súbor v rámci môjho webu) existuje alebo nie:
- ak cieľ (článok 'biovedy') existuje, zobrazí: ...Čo sa týka <a href="index.php?cat=0&file=biovedy">paleontologických</a> nálezov...
- ak cieľ neexistuje, zobrazí len: ...Čo sa týka paleontologických nálezov...

Teraz je situácia taká, že na základe parametrov (cat, file) sa do stránky vloží príslušný html súbor s článkom cez funkciu include_once a hyperlinky v ňom sú pevne dané.

Mne napadlo, že by som mohol do článkov vložiť "pseudotagy" (neviem ako sa to presne volá), napr. ...Čo sa týka [a:paleontológia]paleontologických[/a] nálezov... , a takého súbory potom spracovávať cez fopen() s módom "r", hľadať konštrukcie [a:][/a], a zamieňať ich pomocou str_replace() za text s linkom (ak sa splní podmienka) alebo bez linku.

1. Je to úplne blbý nápad, alebo príliš zložité ? 2. Je čítanie každého súboru cez fopen() a kontrola existencie tých reťazcov príliš zaťažujúca pre server ? Ako by ste takúto vec riešili ? ďakujem :)
Jan Tvrdík
Profil
Dinococcus:
Je to úplne blbý nápad, alebo príliš zložité ?
Je to poměrně běžné „wiki“ řešení, není implementačně složité. Mělo by stačit jedno volání preg_replace_callback při výpisu.

Je čítanie každého súboru cez fopen() a kontrola existencie tých reťazcov príliš zaťažujúca pre server ?
Netřeba každý soubor načítat přes fopen. Mělo by stačit ověřit existenci pomocí is_file.


$content = file_get_contents('biovedy');
$content = preg_replace_callback('#\[a:(?<href>.+?)\](?<text>.+?)\[/a\]#', function ($m) {
    // může a nemusí být potřeba volat htmlspecialchars, záleží, zda $m['text'] může obsahovat HTML
    if (is_file($m['href'])) {
        return '<a href="index.php?cat=???&amp;file=$m[href]">$m[text]</a>';
    } else {
        return $m['text'];
    }
}, $content);
echo $content;
Dinococcus
Profil
díky moc :)
Dinococcus
Profil
Ešte by ma zaujímal ten reg.string. Rozobral som si ho a vyšlo mi toto:

'#\[a:(?<href>.+?)\](?<text>.+?)\[/a\]#'

## - začiatok a koniec reg.stringu
\[ \] - escapované zobrazenie špeciálneho znaku [ a ]
a: /a - "presné" zhody (bez špeciálneho významu)
<href> a <text> - PHP 5.2.2 introduced (?<name>pattern) na pomenovanie patternu (do funkcie preg_replace_callback() )
. - a dot in the pattern matches any one character in the subject, including a non-printing character, but not (by default) newline
+ - equivalent to {1,} = The general repetition quantifier specifies a minimum and maximum number of permitted matches; If the second number is omitted, but the comma is present, there is no upper limit - v spojení .+ je to ľubovoľný počet (aspoň 1) ľubovoľných znakov
() - Subpatterns (pomenované)
? pred ) - equivalent to {0,1} - len 1 znak (??)

...nerozumiem tomu poslednému otázniku :(
Jan Tvrdík
Profil
Dinococcus:
Viz www.php.net/manual/en/regexp.reference.repetition.php: „if a quantifier is followed by a question mark, then it becomes lazy, and instead matches the minimum number of times possible“. Rozdíl se projeví v případě, kdy bude v textu více než jeden odkaz na jednom řádku.

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:

0