Autor Zpráva
it47
Profil
Ahojte,

natrafil som na zaujimavy problem - mam aplikaciu kde sa vyhladavaju ulice. Z jednej webstranky som skopiroval nazov ulice, ktory ked dam vyhladat cez Chrome, vypise 0 vysledkov, pricom napriklad cez Chrome najde pocet spravnych vysledkov 10.

Ta ulica je Pekná

Problem je v tom dlzni na pismeno 'a' - ked ho dam vymazat klavesnicou, tak najskor zrusi iba dlzen (pismeno "a" zostane) a az potom na druhy krat zrusi aj to 'a'.

Cez mb_detect_encoding() bol string identifikovany ako UTF-8. Takze vlastne neviem aky je v tom problem.

Mate tusenie aky to moze byt problem?

Vopred dakujem velmi pekne.

P.S. Ked si ten nazov ulice odtialto skopirujete, tak to á vymaze na prvý krat, kazdopadne z tej stranke sa da vymazat az na druhy krat. A to bude zrejme problem, preco v jednom prehliadaci to skonvertuje spravne a v druhom nie.
Mlocik97m
Profil *
odkaz na tu stranku by sa bodol....
it47
Profil
Mlocik97m:
rad by som dal, ale to je v administracii pod heslom... ale myslim, ze ten opis by mohol byt dostatocny :)
Keeehi
Profil
it47:
Podle popsaného chování mě napadá toto. en.wikipedia.org/wiki/Combining_character
Mlocik97
Profil
JPW -.- žiaľ Vám nepomôžem, lebo diskuje JPW majú rozbyté značky PRE a entity.
it47
Profil
Keeehi:
a existuje nejaka php funkcia, ktora by riesila tento problem?

Vopred dakujem velmi pekne.
Keeehi
Profil
<?php
$input = "a\u{301}";

$output = preg_replace_callback('~(.)\x{301}~u', function($match) {
    switch($match[1]) {
        case 'a': return 'á';
        case 'e': return 'é';
        case 'i': return 'í';
        case 'o': return 'ó';
        case 'u': return 'ú';
        case 'y': return 'ý';
    }
    return $match[0];
}, $input);

echo $input . ' ' . bin2hex($input) . '<br>';
echo $output . ' ' . bin2hex($output) . '<br>';

Jenom pozor, pokud si budeš chtít vyzkoušet tento příklad tak musíš v PHP 7. Zápis unicode znaků pomocí \u{xxx} na druhém řádku je podporovaný až od verze 7. Pokud už ale ten text máš v nějaké proměnné, mělo by ti to fungovat i u nižších verzí.

Jinak je doufám jasné, že ta funkce je jen ukázka. Pro reálné použití by bylo třeba ji rozšířit o velká písmena. Také předpokládám, že asi budeš chtít nahrazovat i jiná diakritická znaménka. No a ma závěr je ještě potřeba zvážit, jakých jazyků se to nahrazení má týkat a podle toho zvolit vhodná písmena.
juriad
Profil
it47:
Ano existuje: php.net/manual/en/normalizer.normalize.php
it47
Profil
juriad:
Ano existuje: php.net/manual/en/normalizer.normalize.php
V php 7.3. mi pise, ze funkcia neexistuje, ale zrejme si na to musim stiahnut nejaky specialny balicek.

Keeehi:
Jinak je doufám jasné, že ta funkce je jen ukázka. Pro reálné použití by bylo třeba ji rozšířit o velká písmena. Také předpokládám, že asi budeš chtít nahrazovat i jiná diakritická znaménka. No a ma závěr je ještě potřeba zvážit, jakých jazyků se to nahrazení má týkat a podle toho zvolit vhodná písmena.
Dakujem pekne, vyskusam :) Cakal som nejake jednoduchsie riesenie, ocividne je to vacsi problem ako som cakal.
Keeehi
Profil
it47:
Cakal som nejake jednoduchsie riesenie,
To je to co navrhuje it47. Neznám všechny existující balíčky, takže jsem vlastně vytvářel obdobu co dělá ta navrhovaná funkce/objekt. Až na to, že to moje je jen ukázka a do produkční verze to má daleko. Ovšem Normalizer je připraven na nasazení.

zrejme si na to musim stiahnut nejaky specialny balicek.
Ano, jde o rozšíření intl. Na linuxu by k tomu mělo stačit něco v takovém stylu
sudo apt-get install php7.3-intl
A restartování PHP.
Pokud máš windows, tak tam přesně nevim, jak se to dělá ale zřejmě bude potřeba stáhnout někde správnou knihovnu, umístit ji do složky s ostatními php knihovnami a v php.ini ji povolit. No a pak restartovat PHP službu.
it47
Profil
Keeehi:
ok, super, vyskusam to, kazdopadne pre tento jeden nahodny pripad to zrejme nema zmysel riesit.

Dakujem vemi pekne za pomoc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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

0