21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
halogan
Profil
Zdravím,
potřeboval jsem vytvořit SEO uri z nadpisu, tak jsem si napsal krátkou funkci, používá jen 2 regexpy, takže je dostatečně rychlá.

function seoUri($uri, $maxlength = false, $separator = "-")

{
$uri = mb_strtolower(trim($uri));
$hemzy = Array("á" => "a", "ä" => "a", "č" => "c", "ď" => "d",
"é" => "e", "ë" => "e", "ě" => "e", "ï" => "i", "í" => "i", "ĺ" => "l",
"ľ" => "l", "ň" => "n", "ó" => "o", "ö" => "o", "ř" => "r",
"š" => "s", "ť" => "t", "ú" => "ů", "ü" => "u", "ý" => "y", "ž" => "z");
foreach ($hemzy as $key => $value) {
$uri = str_replace($key, $value, $uri);
}

$uri = preg_replace("/(&(amp;)?[a-z]+;?)|(&#[0-9]{1,2};?)/", "", $uri); // odstranění entit
preg_match_all("/\w+/", $uri, $casti);
$uri = implode($separator, $casti[0]);

if ($maxlength !== false && is_int($maxlength) && $maxlength < strlen($uri)) {
$uri = substr($uri, 0, $maxlength);
$uri = substr($uri, 0, strrpos($uri, $separator));
}

return $uri;
}


Má jeden povinný parametr (string) a dva nepovinné - maximální délku a separator (defautně pomlčka)

Tato funkce počítá s:
- entitama (odřezává)
- diakritikou (převádí na písmena bez diak.)
- oddělením v půlce slova při zkrácení
- nepoužíváním středníku za entitou
- UTF-8 (nutno mít nastavené mb_internal_encoding("UTF-8"))

Nepočítá však s dlouhým slovem delším než maximální počet znaků.

Snad se vám bude líbit a případné otázky či připomínky říkejte zde.
Charlie
Profil
Ano, ano, velmi pěkné. Určitě se mi to bude hodit. Díky!
Anonymní
Profil *
jen detail v té transformaci (stane se):
"ú" => "ů",
jinak je opravdu nezbytné používat regulární výrazy? Já řeším podobný problém ale jen s funkcí strtr($retezec, $hemzy); //nemusim projíždět pole přes foreach

a v těch "hemzách" nahrazuji všechny entity pomlčkou, potom nahrazuju opakující se entity a takové věci jako tečka s mezerou za jednu pomlčku. Kód tu teď nemám, ale mohu ho doplnit. Jediné co nedělám je zkracování slov.

Domnívám se že jeden strtr s dlouhým polem proběhne rychleji než několik regulárních výrazů po sobě (protože se to interpretuje jen jednou a pak už to řeší jen binární knihovna php)
halogan
Profil
Diky za pripominky, ale strtr nejde, protoze neumi utf. Regularni vyrazy tam jsou jen 2 (a navic pcre), takze to je rychly. Navic to je bez nich slozity a zbytecny.
llook
Profil
Strtr se dá použít na utf, přesně jak píše Anonymní. Prostě místo dvou řetězců mu dáš jedno pole a pak se klíče pole nahrazují hodnotama. Třeba tohle:

echo strtr('abcdef', array('abc' => 'xxx'));

Vypíše "xxxdef".
halogan
Profil
llook: Aha, nevěděl jsem, zkoušel jsem strtr($s, "ěšč", "esc");, teď jsem použil místo foreach ten strtr a jde to v pohodě, díky.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0