2017-06-29 1 views
-1

J'essaie de mettre en surbrillance/gras les mots de la chaîne. La fonction suivante fonctionne bien avec l'anglais mais pas avec le support Unicode. J'ai essayé d'ajouter u pour le support d'Unicode dans la règle d'expression régulière mais ne fonctionne pas pour moi.Support Unicode dans l'expression régulière

function highlight_term($text, $words) 
{ 
    preg_match_all('~[A-Za-z0-9_äöüÄÖÜ]+~u', $words, $m); 
    if(!$m) 
    { 
     return $text; 
    } 

    $re = '~(' . implode('|', $m[0]) . ')~i'; 
    return preg_replace($re, '<b>$0</b>', $text); 
} 

$str = "ह ट इ ड यन भ भ और द"; 

echo highlight_term($str, 'और'); 

sortie

sortie prévue

ह ट इ ड यन भ भ और

+0

Vous feriez mieux de tracer votre code. Je doute que vous l'ayez lu du tout. – revo

+0

Vous avez besoin de 'u' dans la deuxième regex:' $ re = '~'. implode ('|', $ m [0]). 'ui'; '. Pas besoin de parenthèses externes car vous êtes uniquement intéressé par la valeur de correspondance entière (vous remplacez en utilisant la référence arrière $ 0). –

Répondre

0

Fixation de votre approche actuelle

Notez que vous pouvez changer votre première regex à ~[\p{L}\p{M}]+~u pour correspondre à toutes les lettres Unicode (\p{L} avec modificateur u prend connaissance Unicode et correspond à toutes les lettres Unicode) et diacritiques (\p{M} matchs combinant marques) et ajouter un modificateur u à la seconde preg_replace:

function highlight_term($text, $words) 
{ 
    $i = preg_match_all('~[\p{L}\p{M}]+~u', $words, $m); 
    if($i == 0 ) 
    { 
     return $text; 
    } 

    $re = '~' . implode('|', $m[0]) . '~iu'; 
    return preg_replace($re, '<b>$0</b>', $text); 
} 

$str = "ह ट इ ड यन भ भ और द"; 

echo highlight_term($str, 'और'); 

Résultat: ह ट इ ड यन भ भ <b>और</b> द.

Voir la PHP demo

Vous devez modificateur u dans la seconde regex que le texte que vous passez au modèle est Unicode et vous travaillez toujours avec la chaîne Unicode. Pas besoin de parenthèses externes dans la deuxième regex car vous êtes uniquement intéressé par toute la valeur de correspondance (vous remplacez en utilisant $0 backreference).

meilleure façon

Vous pouvez passer un tableau de mots à la fonction de mise en évidence, et correspondre des mots seulement entiers avec les limites des mots qui passent directement l'expression rationnelle à la fonction preg_replace:

function highlight_term($text, $words) 
{ 
    return preg_replace('~\b(?:' . implode("|", $words) . ')\b~u', '<b>$0</b>', $text); 
} 

$str = "ह ट इ ड यन भ भ और द"; 
echo highlight_term($str, ['और','भ']); 
// => ह ट इ ड यन <b>भ</b> <b>भ</b> <b>और</b> द 

Voir this PHP demo

+1

Merci, bonne explication :) – Hassaan

+0

@Hassaan: Jetez un oeil à l'approche améliorée. –

+0

@ WiktorStribiżew les deux façons ont pris le même temps d'exécution, s'il vous plaît corrigez-moi si je me trompe. – Hassaan