Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
VelkyBubak
Člen
Avatar
VelkyBubak:23.7.2018 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.7.2018 9:06
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na VelkyBubak
Petr Čech:23.7.2018 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.7.2018 9:34
the cake is a lie
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na VelkyBubak
David Hynek:23.7.2018 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.7.2018 10:07
Nahoru Odpovědět
23.7.2018 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.7.2018 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.7.2018 10:39
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na VelkyBubak
David Hynek:23.7.2018 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.7.2018 12:01
Čím víc vím, tím víc věcí nevím.
Avatar
Odpovídá na David Hynek
Neaktivní uživatel:23.7.2018 12:09

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

Nahoru Odpovědět
23.7.2018 12:09
Neaktivní uživatelský účet
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na VelkyBubak
Petr Čech:23.7.2018 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.7.2018 12:34
Nahoru Odpovědět
23.7.2018 12:33
the cake is a lie
Avatar
VelkyBubak
Člen
Avatar
Odpovídá na David Hynek
VelkyBubak:23.7.2018 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.7.2018 14:22
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na VelkyBubak
Petr Čech:23.7.2018 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.7.2018 15:37
the cake is a lie
Avatar
VelkyBubak
Člen
Avatar
VelkyBubak:23.7.2018 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.7.2018 16:11
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na VelkyBubak
David Hynek:23.7.2018 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.7.2018 20:33
Čím víc vím, tím víc věcí nevím.
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.7.2018 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.7.2018 8:18
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:24.7.2018 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.7.2018 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.