Autor Zpráva
pajadvorak
Profil
Mám tento kód, který mi zvýrazní hledaná slova. Ale problém, který řeším je, že mi to nezvýrazňuje slova s diakritikou. Jakou tam vidítě chybu? Děkuji

function odzvyraznit($matches) {
            return preg_replace('~<span class="search-result">([^<]*)</span>~i', '\\1', $matches[0]);
}

function zvyraznit($text) {
    $hledany = chop(trim(preg_replace('/\s+/',' ',$_GET["text"])));
    $search = preg_quote(htmlspecialchars(chop(trim(preg_replace('/\s+/',' ',$_GET["text"])))), '~');

    $hledany = str_replace('(', '\(', $hledany);
    $hledany = str_replace(')', '\)', $hledany);

    $search = str_replace('(', '\(', $search);
    $search = str_replace(')', '\)', $search);

    if ($search) {        
        $arrays = Explode(" ", $hledany);
        for($s = 0; $s <= Count($arrays) - 1; $s++){
            $text = preg_replace("~$arrays[$s]~i", '<span class="search-result">\\0</span>', $text);
            // odstranění zvýrazňování z obsahu <option> a <textarea> a zevnitř značek a entit
            $span = '<span class="search-result">[^<]*</span>';
            $pattern = "~<(option|textarea)[\\s>]([^<]*$span)+|<([^>]*$span)+|&([^;]*$span)+~i";
            $text = preg_replace_callback($pattern, 'odzvyraznit', $text);
        }
    }
    return $text;
}
Kajman
Profil
Pokud používáte utf-8, tak zkuste používat flag u.
Mlocik97
Profil
Kajman:
ja skôr nechápem prečo používa PHP, nieje toto vhodnejšie robiť na client-sidu (v JS)? jestli správne chápem čo chce.
Andrej.B
Profil
Kajman:
Skusal som si ten kod a mne funguje super. Je to v nastaveni PHP? Lebo z poslaneho linku neviem kde moze byt chyba.
pajadvorak
Profil
Kajman:
Tak špatně. Omlouvám se. Diakritika chodí. Problém je v tom, když se hledá bez diakritiky. Takže například hledám hruska. Najde mi to v tabulce hruška. A le hruška v textu není zvýrazněna.

Otázka tedy zní: jak udělat, aby to ve výsledku označilo i slova s diakritikou při zadání do hledání slova bez diakritiky? Děkuji.
Kajman
Profil
Udělejte v hledaném řetězci náhrady, např. s nahradíte za [sš] atp., abyste hledal hru[sš]ka. Kdyby to ani s flagem u nebralo dobře velikost písmen a nenašlo slovo HRUŠKA, tak s nahraďte za [sšŠ].
Keeehi
Profil
pajadvorak:
Problém toho je, že ty dopředu nevíš, jestli a které písmeno má diakritiku, takže to bohužel musíš udělat u všech písmen.
[h][rř][uůú][sš][k][aá]
Problém toho je, že pokud to chceš udělat obecně, tedy pro všechny jazyky světa, pak ty třídy budou rozsáhlejší. Našel jsem třeba tuto tabulku ale obávám se, že ani v ní nebudou úplně všechny znaky ale většina by být mohla.

Druhá možnost je to rozsekat na slova, odstranit diakritiku (na to jsou nástroje), porovnat a pokud se to bude shodovat tak zvýraznit původní slovo a nakonec to zase složit dohromady.
Kcko
Profil
Nebo to uděláš tak, že si origo text převedeš vedle na text bez diakritiky.

Následující funkce Ti vyznačí na jakých pozicích se hledané slovo nachází.
Poté projedeš originální text znak po znaku a tam kde ti ona funkce vyznačila začátek a konec, vložíš ono zvýraznění.
Tohle jsem používal kdysi dávno a fungovalo to dobře.

    public static function checkPosition($word, $text)
    {        
        $last_pos = 0;
        $from     = array();
        $to       = array();

        while( ($pos = strpos($text, $word, $last_pos)) !== false)
        {

             $last_pos = $pos + 1;
             $positions[] = array("od" =>  $pos, "do" =>  $pos + strlen($word));
             
             $from[] = $pos;
             $to[]   = $pos + strlen($word) - 1; 
        }
        
        
        
        return array($from, $to);
    }

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