Autor | Zpráva | ||
---|---|---|---|
Dinococcus Profil |
#1 · Zasláno: 22. 3. 2013, 15:08:34
Č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=???&file=$m[href]">$m[text]</a>'; } else { return $m['text']; } }, $content); echo $content; |
||
Dinococcus Profil |
díky moc :)
|
||
Dinococcus Profil |
#4 · Zasláno: 22. 3. 2013, 16:45:52
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 |
#5 · Zasláno: 22. 3. 2013, 16:58:42
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. |
||
Časová prodleva: 11 let
|
0