Autor Zpráva
Davex
Profil
Při vložení příspěvku je rozpoznávačem adres, který domýšlí odkazy, chybně nalezen konec URL ve výpisu kódu [pre]. V určitých situacích zahrne jako součást URL i uvozovky, znaky < >, a entity před středníkem. Případně i samotnou uzavírací značku [/pre]. Vznikají pak chyby ve vypsaném kódu, jako středníky za koncem tagu, entity při opakovaném uložení a chybné odkazy.

<html>
  <meta name="generator" content="PSPad editor, www.pspad.com">;
  <title> </title>
  <a href="http://www.jakpsatweb.cz">
  www.JakPsatWeb.cz</a>;
  <a href="http://www.jakpsatweb.cz">
  www.JakPsatWeb.cz</a>
  <a href="http://www.jakpsatweb.cz">www.JakPsatWeb.cz</a>
  <ul>
  <li><a href="http://www.jakpsatweb.cz">
  www.JakPsatWeb.cz</a></li>;
  <li><a href="http://www.jakpsatweb.cz">
  www.JakPsatWeb.cz </a></li>
  </ul>

Po druhé úpravě příspěvku:
<html>
  <meta name="generator" content="PSPad editor, www.pspad.com"&gt;
  <title> </title>

Chamurappi
Profil
Reaguji na Davexe:
Vznikají pak chyby ve vypsaném kódu, jako středníky za koncem tagu
V Exploreru je takový odkaz navíc pocuchán JUSHem, ukazuje třeba toto:
<meta name="generator" content="PSPad editor, ' target=_blank rel=nofollow>www.pspad.com">;

Ve zdejším JavaScriptu používám na výlov odkazů při Ctrl+K přibližně takovýto regulární výraz:
řetězec.match(/(https?\:\/\/|www\.)(?:["‚„“‘\)\.…,:;]*[^\s"‚„“‘\)\.…,:;]+)+/gi)
Chtělo by ho to ještě vylepšit, aby nepohlcoval ukončovací BB značky na konci adresy, ale už nyní asi hledá lépe, než ta funkce, co je v PHP teď. Kdyby se o výrobu odkazů staral bb_codes.php, už bych ho tam býval zkusil dát.

Asi bychom také měli zamezit tomu, aby se odkazy utvářely uvnitř [pre] — tam stejně většinou nejsou míněné jako odkazy.
Davex
Profil
V Exploreru je takový odkaz navíc pocuchán JUSHem
Aha, toho jsem si v Chrome nemohl všimnout, ale nová beta Opery 10.50 se v tomto chová podobně jako Explorer.

Asi bychom také měli zamezit tomu, aby se odkazy utvářely uvnitř [pre]
O tom jsem už přemýšlel - po zvýraznění JUSHem jsou totiž nepoužitelné.
Chamurappi
Profil
Reaguji na Davexe:
Tak v sandboxu by měla být závada opravena, popravil jsem funkci urlMaker($text, $wrap) a na její místo povolal tu regulární příšeru. Ještě trochu víc zpříšerněnou. Teď by to mělo chodit dokonale.

po zvýraznění JUSHem jsou totiž nepoužitelné
Dodatečně vyhazovat odkazy z <pre> by asi bylo složitější. Možná to není vždy žádoucí, když nad tím tak (líně) přemýšlím.
Chamurappi
Profil
Teď jsem ještě upravil, aby odkazy do diskuse byly relativní, měly speciální třídu a neměly rel="nofollow". A také, aby šlo odkázat i na adresy obsahující (obě) hranaté závorky.
K dokonalosti chybí už jen automatické dosazování nadpisů.

Potěšilo by mě, kdyby mi v tom někdo našel chybu :-)
Davex
Profil
V ostré verzi (do sandboxu neznám heslo) jsem narazil na problém s domýšlením odkazu uvnitř značky [url], kde se pohltí ukončovací značka [/url].
Příklad:
Subdoména na locale (localhost/www jako www.localhost)[/url]
Davex
Profil
Zdá se, že řešení [#4] ještě trochu zlobí. V sandboxu se doplnil odkaz po obalení výpisu v tomto příspěvku: Podstrceni souboru pro vsechny URL.
Str4wberry
Profil
Co navrhuješ? Vyhazovat odkazy z [pre]?
Chamurappi
Profil
S BB kódy odkazů zřejmě souvisí problém, který se v sandboxu bez jasné příčiny zjevil 27. května a o kterém je zmínka jen na hřišti (a vlastně ještě tady): Pokud příspěvek obsahoval ten nejobvyklejší zápis odkazu, funkce enCodeBB v mžiku všechno sežrala. Mnou v březnu spatlaná tvorba odkazu vypadala takhle:
// Výchozí text "Odkaz" nahradíme adresou.
$bburlkus = "(?:[^<>\[\]\n]+(?:\[[^<>\[\]\n]*\])*)+";
$pattern[] = "/\[url=(http[s]?:\/\/" . $bburlkus . ")\]Odkaz\[\/url\]/i";
$pattern[] = "/\[url=(" . $bburlkus . ")\]Odkaz\[\/url\]/i";
$replacement[] = '<a href="\\1" target="_blank" rel="nofollow">\\1</a>';
$replacement[] = '<a href="http://\\1" target="_blank" rel="nofollow">\\1</a>';

// Standardní odkaz.
$pattern[] = "/\[url=(http[s]?:\/\/" . $bburlkus . ")\](.+?)\[\/url\]/i";
$pattern[] = "/\[url=(" . $bburlkus . ")\](.+?)\[\/url\]/i";
$replacement[] = '<a href="\\1" target="_blank" rel="nofollow">\\2</a>';
$replacement[] = '<a href="http://\\1" target="_blank" rel="nofollow">\\2</a>';

// Odkaz vzniklý pouhým obalením.
$pattern[] = "/\[url](http[s]?:\/\/" . $bburlkus . ")\[\/url\]/i";
$pattern[] = "/\[url](" . $bburlkus . ")\[\/url\]/i";
$replacement[] = '<a href="\\1" target="_blank" rel="nofollow">\\1</a>';
$replacement[] = '<a href="http://\\1" target="_blank" rel="nofollow">\\1</a>';

// Převod odkazů nezapsaných pomocí BB značky
$interpunkce = "[\(\)\.,:;\[\]]";
$urlkus = "(?:(" . $interpunkce . "|&lt;|&gt;|&quot;|&#039;|&#92;)*(?:(?!" . $interpunkce . "|&lt;|&gt;|&quot;|&#039;|&#92;|&#8218;|&#8222;|&#8220;|&#8216;|&#8230;|<)[^\s])+)+";
$pattern[] = "/(^|\s|" . $interpunkce . ")(https?\:\/\/" . $urlkus . ")/i";
$pattern[] = "/(^|\s|" . $interpunkce . ")(www\." . $urlkus . ")/i";
$replacement[] = '\\1<a href="\\2" target="_blank" rel="nofollow">\\2</a>';
$replacement[] = '\\1<a href="http://\\2" target="_blank" rel="nofollow">\\2</a>';

Dodnes mi není jasné, proč to začlo zlobit. Chápal bych, kdyby to nějak viditelně timeoutovalo (to to umí), chápal bych, kdyby se závada projevila po nějaké úpravě, ale ono se to úplně samo rozhodlo vracet prázdný řetězec. Tuší někdo, čím to mohlo být? Kupodivu pomohlo, když jsem za druhý řádek přidal:
$bburlkus = "[^\]]+";
Ale ten předchozí $bburlkus mi nepřipadá nijak zvlášť složitý.

Proč tu o tom ale píšu:
1) Fakt mi to vrtá hlavou. Je to roztomilá záhada.
2) Chtěl bych, aby šlo odkazovat i na adresy, v nichž je [] — tedy vrátit původní $bburlkus.
3) Další případné zásahy to můžou třeba vyvolat znovu… když nevíme, čím to bylo.
4) Nejde mi uložit upravený první příspěvek ve vláknu 1000 (tzn. nová pravidla). Vynadá mi to, že jsem nevyplnil povinná pole.



Reaguji na Davexe:
jsem narazil na problém s domýšlením odkazu uvnitř značky [url]
Asi by pomohlo sloučit nahrazování z řádků 9 až 12 s nahrazováním na řádcích 23 až 26. Náhrady jsou u nich v podstatě kompatibilní, takže by mělo jít propojit regulární výrazy do jednoho svislítkem, aby si vzájemně nelezli do zelí. Je to dobrý nápad?

V sandboxu se doplnil odkaz po obalení výpisu
Sice to není řešení, ale v klávesové mapě je „/funkce/Zamezit BB formátování“ — tím lze v označeném textu neviditelně rozbít jakoukoliv sekvenci znaků.
Davex
Profil
[#8] Str4wberry:
Doplňování odkazů všude, nejenom v [pre], by mělo pobrat jen platnou adresu, což http://www.%{HTTP_HOST}... nesplňuje. Asi by se regulární výraz $bburlkus mohl rozdělit na část pro hostname a cestu, s určením zakázaných znaků v jednotlivých částech (aby vyhověla i diakritika). Konkrétní řešení na to teď nemám.

[#9] Chamurappi
Zdá se, že v sandboxu je už doplňování odkazu uvnitř popisu [url] http://djpw.cz/ opraveno, nebo ne? V náhledu jsou odkazy vložené, ale koncové [/url] se nezobrazí.

Aha, takže při editaci dojde k překřížení [url]...<a>...[/url]</a>. Možná by stačilo, nedoplňovat odkazy uvnitř [url].

S BB kódy odkazů zřejmě souvisí problém, který se v sandboxu bez jasné příčiny zjevil 27. května
Nedošlo v této době na hostingu k upgrade PHP a PCRE knihovny. Nevím nic konkrétního, ale mohlo by to leccos vysvětlovat.
Str4wberry
Profil
Chamurappi:
K dokonalosti chybí už jen automatické dosazování nadpisů.

Žádám o otestování.

Témata bez reakcí
Pravidla
O uživateli Chamurappi
Domýšlení odkazu ve výpisu kódu negativně ovlivňuje kód
O této diskusi
Str4wberry
Profil
Davex:
Doplňování odkazů všude, nejenom v [pre], by mělo pobrat jen platnou adresu
Ale třeba zrovna to „http://www.%{HTTP_HOST}“ stejně patří do [pre] a jsem toho názoru, že interpretace odkazu v [pre] není dvakrát žádoucí. Tudíž se teď všechny značky kromě <b> a <i> (stejně jaku u JUSHe) odstraní.

Možná by stačilo, nedoplňovat odkazy uvnitř [url].
Ale jak to udělat? Snad jednině tu adresu mezi [url=…] a [/url] (tedy vlastně text odkazu) znehodnotit komentářem.
Chamurappi
Profil
Reaguji na Davexe:
Nedošlo v této době na hostingu k upgrade PHP a PCRE knihovny?
Mrknul jsme na phpinfo() a tam se jako PCRE Library Version ukazuje „7.8 2008-09-05“. Funkce phpversion() vrací „5.2.9“. Náhlý upgrade na víc jak rok staré verze nezní moc pravděpodobně.


Reaguji na Str4wberryho:
Žádám o otestování.
Dobrá práce. Testoval jsem:
1) Odkazy vedoucí do sandboxu to neumí.
2) Text odkazu na úvodní stránku diskuse se promění v prázdný řetězec.
3) Text odkazu na neexistující stránku se také promění v prázdný řetězec.
4) V textu odkazu je číslo stránky, to je asi zbytečné. Pokud někde ukazuji titulek JavaScriptem, ořezávám číslo stránky a případnou hvězdičku z konce, tzn. beru jen první uzávorkovanou skupinu z /^Diskuse:\s+(.*?)\s*\*?(\s+\(\d+\))?$/.
5) Výsledný odkaz je absolutní, má rel="nofollow" a nemá class="do-diskuse".

„Možná by stačilo, nedoplňovat odkazy uvnitř [url].“
Ale jak to udělat?
Hledej zelí.
Myslel jsem to tak, že když máš jeden regulární výraz /A(B)CD(EFG)H/ nahrazovaný za "x\1y\2z" a druhý regulární výraz /(FG)/ nahrazovaný za "x\1y\1z", můžeš je smíchat do jednoho regulárního výrazu /A(B)CD(EFG)H|(FG)/ nahrazovaného za x\1\3y\2\3z — pak se obě akce provedou při jednom průchodu a vzájemně si neovlivní své výstupy.


Reaguji na sebe:
Nejde mi uložit upravený první příspěvek ve vláknu 1000 (tzn. nová pravidla). Vynadá mi to, že jsem nevyplnil povinná pole.
Je to tím, že jsem v něm zmínil zkracovač „jdem.cz“, který je na černé listině. Nesouvisí to s BB kódy, omlouvám se za planý poplach.
Str4wberry
Profil
Ad 1) Sandbox se úmyslně vynechává, protože se tam stejně skript nedostane přes autorizaci. Takže by se asi měl odkaz odsandboxovat (+ doplnit textem odkazu z ostré verze), jak už někdo dříve navrhoval, co?
Chamurappi
Profil
Reaguji na Str4wberryho:
Ano, tak to už v podstatě fungovalo, po všech náhradách BB→HTML se provedlo nahrazení:
$pattern[] = "/<a href=\"http\:\/\/diskuse\.jakpsatweb\.cz\/(?:\.sandbox\/)?(?:index\.php)?([^\"]+)\" target=\"_blank\" rel=\"nofollow\">/";
$replacement[] = '<a href="./\\1" target="_blank" class="do-diskuse">';
… čímž vznikl relativní odkaz.
Str4wberry
Profil
Tak jsem se pokusil o opravu tvých připomínek 1–5. Můžeš hledat další chyby. :–)
Jan Tvrdík
Profil
Str4wberry:
Nepodporuje to djpw.cz (např. http://djpw.cz/106981).
Str4wberry
Profil
Nevidím důvod proč by mělo.
Davex
Profil
Odkaz na http://diskuse.jakpsatweb.cz/templates/djpw.js to podporuje až moc: 301 Moved Permanently
Str4wberry
Profil
To je pravda. Týkalo se to i všech ostatních skriptů, stylů a obrázků. Opraveno.
Davex
Profil
Doplňování odkazů v sandboxu je aktuálně rozbité, protože se nepřidá úvodní http://.

www.djpw.cz
www.pécéspad.cz
Str4wberry
Profil
Zvláštní. Tady to ještě fungovalo a nejsem si vědom, že by od té doby proběhla s tím související úprava. Opraveno.
Chamurappi
Profil
Upravil jsem automatické dosazování nadpisů, aby při odkazu na podnadpis dosadilo do textu i ten podnadpis. Stačí tedy napsat:
http://diskuse.jakpsatweb.cz/?action=vthread&forum=8&topic=106539#var
… a vyleze z toho:
Časté potíže, zajímavosti a poučné debaty » Používejte var

Pomocí náhledů příspěvků nebo na hřišti mi v tom prosím zkuste najít chybu, připadalo mi to podezřele jednoduché. (Funguje to jen v sandboxu, pochopitelně.)
Chamurappi
Profil
Reaguji na Str4wberryho a Davexe:
„Možná by stačilo, nedoplňovat odkazy uvnitř [url].“
Ale jak to udělat?
Udělal jsem to teď takhle:
  $urlPattern[] = "\[url=(" . $bburlkus . ")\](.+?)\[\/url\]";
  $urlPattern[] = "\[url\](" . $bburlkus . ")\[\/url\]";
  $urlPattern[] = "(^|\s|" . $interpunkce . ")((?:https?\:\/\/|www\.)" . $urlkus . ")";
  $pattern[] = "/" . implode("|", $urlPattern) . "/i";
  $replacement[] = '\\4[url=\\1\\3\\5]\\2\\3\\5[/url]';
Využívá to princip, který jsem popsal v [#13] — všechny náhrady jsou v jednom společném reguláru a každá část vrací při nalezení jinou podskupinu. Při matchnutí jsou ostatní podskupiny prázdné, takže je jde prokombinovat: v \1\3\5 bude vždy jen jedna adresa, ve \2\3\5 vždy jen jeden text odkazu. Když se bude zpracovávat [url=adresa]text[/url], bude část chytající se prefixu www spát. Všechny odkazy se tímhle jedním nahrazením srovnají do základního tvaru a na ten se pak pouští callback (který doplňuje protokol apod.).

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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