Autor Zpráva
nethor
Profil
Ve snippetech vyhledávání potřebuji z textu vyházet vícenásobné mezery.
Používám tento postup:
mb_internal_encoding("UTF-8"); 
mb_regex_encoding("UTF-8");

function bezmezer($text){
    $text = Trim(preg_replace("~\s+~"," ",$text));
    return    $text    ;
}

Zůstávají tam ale tvrdé mezery.

Živá ukázka (2.snippet): www.doma-pohoda.cz/-hlidani-deti-liberec

Proč není tvrdá mezera považována za bílý znak?
Jak se to dá ošetřit?

(
Nefunguje překopírování tvrdé mezery do scriptu, ani zápisy
    $text = Trim(preg_replace("~[^\S]+~"," ",$text));
    $text = Trim(preg_replace("~\W+~"," ",$text));  // vyhází mezery, ale i ěščřž ...
    $text = Trim(preg_replace("~ +~"," ",$text));
)
DJ Miky
Profil
Měl by fungovat zápis pomocí escape sekvence \xXX, pro tvrdou mezeru je to \xA0 (A0 = desítkově 160). Takže např. ~(\s|\xa0)+~.
nethor
Profil
DJ Miky:

Díky za nasměrování, už to funguje.
Použil jsem zápis:
$text = Trim(preg_replace("~[\s|\xC2|\xA0]+~"," ",$text));
DJ Miky
Profil
V případě, že použiješ hranaté závorky (výčet znaků), tam nesmí být svislítka (znak |). Takto ti RV odstraní všechna svislítka v textu.
nethor
Profil
JJ, tedy
$text = Trim(preg_replace("~(\s|\xC2|\xA0)+~"," ",$text)); nebo $text = Trim(preg_replace("~[\s\xC2\xA0]+~"," ",$text));

Teď ale koukám , že mi to mrší některé znaky, např.

Šalda -> � alda
DJ Miky
Profil
Aha, omlouvám se za mystifikaci. Tvrdá mezera je v UTF-8 kombinace 0xC2 0xA0, proto v prvním případě ještě přebývá svislítko a v druhém chybí modifikátor „u“ (podpora UTF-8). Znak „Š“ má totiž v UTF-8 kód 0xC5 0xA0, proto se detekuje samotné 0xA0 a nahradí se za mezeru, čímž vznikne neplatná UTF-8 sekvence. Tedy:
~(\s|\xC2\xA0)+~u (v tomto případě není modifikátor „u“ nezbytně nutný, ale je lepší ho i tak uvést, když se pracuje s UTF-8 znaky)
nebo
~[\s\xc2\xa0]+~u
nethor
Profil
Teď to funguje skvěle.
Díky za pomoc i vysvětlení.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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