Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"
Avatar
VelkyBubak
Člen
Avatar
VelkyBubak:23. července 9:06

Ve vyhledávání na svém webu používám "hezké url" a dvojice proměnná + hodnota, jsou odděleny pomlčkou. Co jsem si dříve neuvědomil je, co se stane, když se hledá pomlčka, nebo něco s pomlčkou v názvu.

Zkusil jsem: Problému by se mohlo dát zabránit používáním jiného oddělovače, ale to jen přesune problém na jiný znak. Také by mohlo jít "escapování" uživatelského vstupu, ale tam potřebuji přijít na to, kde to mohu udělat.

Chci docílit: Potřebuju ošetřit uživatelský vstup, mezi odesláním formuláře a scriptem, co mi zpracovává předané hodnoty.

 
Odpovědět 23. července 9:06
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na VelkyBubak
Petr Čech:23. července 9:34

Tak řešení je celá řada:
1. necháš pomlčku, a jako oddělovač se bude počítat pouze ta první. Asi takto:

foreach(explode('/','/key-pair/key2--value') as $pair){
    $parts = explode('-',$pair,2);
    list($key,$value) = $parts; // TODO ošetřit, že existuje key, value
}

2. lze se inspirovat např. u Yii1, které používá notaci /key1/val1/ke­y2/val2
**3. lze se inspirovat u Nette a nebo většiny webů s hezkou URL

U hezkých url není cílem zbavit se otazníků a ampersandů. Cílem je zbavit se názvu parametru. Takže třeba Nette parametry pojmenuje automaticky podle pozice - máš třeba

actionFoo($id,$name){
    ...
}

Aby toto zavolal jdeš na url /foo/1/myname - to je pro uživatele mnohem pohodlnější, ale hlavně je to pro tebe pohodlnější, jakmile implementuješ ten mechanismus.

Nahoru Odpovědět 23. července 9:34
the cake is a lie
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na VelkyBubak
David Hynek:23. července 10:04

Jestli se nepletu, tak první pomlčka bude vždy, tedy jestli jich po první pomlčce bude milion je úplně jedno, protože již budou součástí hledaného výrazu. Jen bych pomlčky před hledáním nahradil mezerama a ještě bych je algoritmem, zkrátil na jednu, když jich za sebou bude víc. Já to tak mám udělaný taky. Viz to co používám:

function hezka_url($nadpis)
{
$prevodni_tabulka = Array('ä'=>'a','á'=>'a','à'=>'a','ã'=>'a','â'=>'a','č'=>'c','ć'=>'c','ď'=>'d','ě'=>'e','é'=>'e','ë'=>'e','è'=>'e','ê'=>'e','í'=>'i','ï'=>'i','ì'=>'i','î'=>'i','ľ'=>'l','ĺ'=>'l',
'ń'=>'n','ň'=>'n','ñ'=>'n','ó'=>'o','ö'=>'o','ô'=>'o','ò'=>'o','õ'=>'o','ő'=>'o','ř'=>'r','ŕ'=>'r','š'=>'s','ś'=>'s','ť'=>'t','ú'=>'u','ý'=>'y','ů'=>'u','ü'=>'u','ù'=>'u','ũ'=>'u','û'=>'u','ž'=>'z','ź'=>'z');
$nadpis = strtr(mb_convert_case($nadpis, MB_CASE_LOWER, "UTF-8"),$prevodni_tabulka);
    $url = $nadpis;
    $url = iconv("utf-8", "us-ascii//TRANSLIT", $url);
    $url = strtolower($url);
    $url = preg_replace('/[^-a-z0-9_ ]+/i', '', $url);
    $pole = explode(" ",$url);
    $url = implode("-",$pole);
    $url = preg_replace('/--/i', '', $url);
    return $url;
}
Editováno 23. července 10:07
Nahoru Odpovědět 23. července 10:04
Čím víc vím, tím víc věcí nevím.
Avatar
VelkyBubak
Člen
Avatar
Odpovídá na David Hynek
VelkyBubak:23. července 10:39

zkusím to znovu s příkladem
url: https://server/…obsah_18-Vse
první pomlčka je uživatelský vstup z pole název (prostě uživatel zadal vyhledávat pomlčku) a ostatní mi oddělují proměnné a hodnoty
co se vyhledávání týká, první pomlčka může a nemusí být, ale potřeboval bych ji někde mezi potvrzením formuláře a znovunačtením stránky vyescapovat (resp. převést na něco jiného)
zatímco ostatní pomlčky, co nejsou uživatelským vstupem, ale oddělovači proměnných a hodnot bych potřeboval zachovat v aktuálním stavu

Petr Čech:
ad2, je vpodstatě co používám, jen jako oddělovač používám pomlčku, kdybych to předělal na lomítka, jen tím přesunu problém na jiný znak (problém nastane znovu při vyhledávání lomítka)

Myslím, že bych vpodstatě asi potřeboval zjistit, jakým způsobem metoda GET funguje

 
Nahoru Odpovědět 23. července 10:39
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na VelkyBubak
David Hynek:23. července 12:01

A proč nepoužiješ POST? Tam můžeš mít proměnní i s diakritikou, včetně pomlček, podtržítek.

A jen nápad, kdybys chtěl vytrvat na tom GET a chtěl přenést pomlčku, co ji při zpracování dotazu převést na slovo? př:

$dotaz = preg_replace('/-/i', ' pomlcka ', $url);
Nahoru Odpovědět 23. července 12:01
Čím víc vím, tím víc věcí nevím.
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na David Hynek
Daniel Vítek:23. července 12:09

TLDR; Do GETu taky můžeš narvat cokoliv, jsou pro to funkce urlencode a urldecode.

Nahoru Odpovědět  +1 23. července 12:09
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na VelkyBubak
Petr Čech:23. července 12:33

Pokud použiješ styl 2, můžeš udělat "/key/".urlencode($value). Potom při dekódování jen uděláš urldecode. Lomítko je tady mnohem lepší, protože z urlencode ti lomítko určitě nevyleze, navíc je to pro URL typický oddělovač.

Jinak bych ale měl jinou poznámku. Celé to, co děláš je k ničemu, to není pretty url, v podstatě děláš úplně to samé jako standardní GET, jen je to mnohem těžkopádnější.
Pretty url se dělá především proto, aby se eliminovaly klíče a nahradily se jen pozicí:

  • toto v podstatě není pretty url: /key1/value1/key2/value2 - je to vlastně to samé jako ?key1=value1&ke­y2=value2, jen jsi prohodil pár znaků
  • toho je pretty url: /value1/value2, co že to je za proměnné ti určí controller, a převede to na parametry metody.
Editováno 23. července 12:34
Nahoru Odpovědět 23. července 12:33
the cake is a lie
Avatar
VelkyBubak
Člen
Avatar
Odpovídá na David Hynek
VelkyBubak:23. července 14:22

David Hynek:
V POST to původně bylo, a ano, tam s tím není problém. Předělávka do GET byla z toho důvodu, aby šly výsledky hledání snadno uložit do záložek (to s POST neuděláš).

Petr Čech:
Aha, ok. Tak to není pretty url a pokud chápu správně, nebylo by pro mě vhodné, protože potřebuji vědět, co bylo zatrženo a z hodnot samotných se to zjistit nedá.

Kód na serveru jsem vpodstatě zdědil a po odeslání formuláře, dochází k průchodu krz .htaccess, kde se celá část za vyhledavani/ (https://server/…obsah_18-Vse) převede na GET[prom1], a to se následně zpracovává.
Jediné co mě napadá, je pomlčku v názvu nahradit javascriptem před odesláním.
Nejvíce by se mi líbilo, odchytit $_GET[nazev] hned po odeslání formuláře (před průchodem krz .htaccess) a v té chvíli zakódovat třeba pomocí urlencode($_GET[na­zev]), ale netuším, zda to vůbec jde.

 
Nahoru Odpovědět 23. července 14:22
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na VelkyBubak
Petr Čech:23. července 15:37

A proč znovuvynalézáš kolo a nenecháš to prostě v tom původním formátu? Ty stejně musíš udělat urlencode(), takže jediné, co měníš oproti standardnímu GET tvaru jsou oddělovače.

Nahoru Odpovědět 23. července 15:37
the cake is a lie
Avatar
VelkyBubak
Člen
Avatar
VelkyBubak:23. července 16:11

Petr Čech:
nejsem si 100% jist, co myslíš tím původním formátem, ale pokud to chápu dobře, vpodstatě tvrdíš, že je špatně ta část co převádí celý výraz na GET[prom1], respektive .htaccess. S tím se dá souhlasit, ale zrovna tomu jsem se snažil pokud možno vyhnout... Změnou v .htaccess toho můžu rozbít nejvíc.

Aktuálně tam mám

AddDefaultCharset UTF-8
RewriteEngine On

RewriteCond  %{HTTP_HOST} ^www\.anime\.akihabara\.cz
RewriteRule  (.*) http://anime.akihabara.cz/$1 [R=301,L]

RewriteCond  %{HTTP_HOST} ^anime.akihabara\.cz/index.php
RewriteRule  (.*) http://anime.akihabara.cz/ [R=301,L]

Options +Indexes
Options +FollowSymLinks


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.*)/(.*)$
RewriteRule ^(.*)/(.*)$ /$1.php?prom1=$2 [L,QSA]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /chyba.php [L]

a nevím jak z toho vyjmout vyhledávání, aniž bych poškodil něco jiného

 
Nahoru Odpovědět 23. července 16:11
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na VelkyBubak
David Hynek:23. července 20:33

tak to udelej jeste jinak viz

RewriteRule ^(.*)/(.*)$ /$1.php?prom1=$2 [L,QSA]

nahrad

RewriteRule ^(.*)/(.*)$ /zpracuj.php?ukol=$1&prom1=$2 [L,QSA]

A pak muzes v promenne ukol odchytit vyhledavaji od ostatnich ukolu, ktere pak jednoduse nasmerujes kam potrebujes.

Nahoru Odpovědět 23. července 20:33
Čím víc vím, tím víc věcí nevím.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24. července 8:18

pouzivam toto

function escapeUrl(str)
{
var func;
func = encodeURIComponent || encodeURI || escape;
return func(str);
//encodeURIComponent(value).replace(/!/g,'%21').replace(/'/g,'%27').replace(/\(/g,'%28').replace(/\)/g,'%29').replace(/\*/g,'%2A').replace(/%20/g,'+');
}

function escapeHtml(str) {
    var map = {
        "&": "&",
        "<": "&lt;",
        ">": "&gt;",
        "\"": "&quot;",
        "'":  "&apos;"
    };
    return str.replace(/[&<>"']/g, function(m) { return map[m]; });
}

v php mam podobne funkce, pouziti vypata takto

$str = '    <td><a href="'. escapeHtml('zas_upl.php?form_type=upload&file='.escapeUrl($item->name_full)) .'" class="btn btn-mini" target="blank">Upload</a></td>';

Cili escapujes values

str = 'odesli.php?ukol=' + escapeUrl(hodnota) + '&prom1=' + escapeUrl(hodnota)

A pak to cele escapjes na html, abys to mohl vypsat do html kodu

str = escapeHtml(str);
alert('<a href="' + str +'">');

vyhledavani/--nazev_kde-obsahuje-obsah18-Vse
S takovym parsovanim hodne stesti. Jedine nahradit, jak psal Hynek, pomlcku necim jinym.
$dotaz = preg_replace('/-/i', ' nahrazeno ', $url); // viz Hynek
Na jednu stranu chces hezkou url, ale na druhou stranu chces escapovat pomlcku :) Urlencode pomlcku samo neescapuje, protoze pomlcka je povoleny znak. Takze, ve tvem pripade budes muset pouzit tu variantu s replace a najit si v tabulkach, jake ma pomlcka alternativy.

Postup:

1. https://translate.google.com/
'pomlcka' - cestina do anglictiny - 'dash'
2. google.com
'php url encode dash'
$dotaz = preg_replace('/-/i', ' nahrazeno ', $url); // viz Hynek
3. https://stackoverflow.com/…d-dot-in-php

$str = str_replace('.', '%2E', $str);
$str = str_replace('-', '%2D', $str);
 
Nahoru Odpovědět 24. července 8:18
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24. července 8:22

nebo bod 2
google = ascii table url dash
-> https://www.ascii.cl/htmlcodes.htm
-> minus: dec = 45, hex = 2D, symbol = -, html_number = &#45, html_name = (nic, ale mam pocit, ze existuje −), mean (vyznam) = minus sign

 
Nahoru Odpovědět 24. července 8:22
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 13 zpráv z 13.