2010-12-14 54 views
5

Donc, je fais une fonction de recherche pour les commentaires. Quelqu'un d'autre ici m'a aidé avec le SQL query. Ce que je veux aussi faire est de mettre en évidence le texte de la requête de recherche dans les résultats.PHP - mettre en surbrillance le texte d'une chaîne contenant du code HTML

Les résultats sont stockés en HTML dans un $variable. Comment est-ce que je peux emballer le texte de requête de recherche dans une balise <span> par exemple, sans ruiner le code HTML.

par ex. la requête de recherche peut être foo bar et la sortie peut ressembler à:

<p>bla bla foo bar bla</p> 

il devrait donc être quelque chose comme:

<p>bla <span class="highlight">foo bar</span> bla bla</p> 

Répondre

2

Je pense que cela est plus compliqué qu'il n'y paraît. Si nous recherchons foo bar puis

<p>bla bla foo bar bla</p> 

seront convertis en

<p>bla <span class="highlight">foo bar</span> bla bla</p> 

mais qu'en certains cas particuliers? Il se pourrait que foo bar est adaptée dans une balise HTML:

<p>bla bla <span class="foo bar">foo bar</span> bla</p> 

qui sera remplacé comme

<p>bla <span class="<span class="highlight">foo bar</span>">foo bar</span> bla bla</p> 

Ai-je raison avec cela? Je n'ai pas été dans ce problème, mais je vous recommande de vérifier sur les docs de CakePHP (oui, je sais que vous n'utilisez pas le framework--) dans l'aide Text, la méthode highlight() qui gère correctement les balises HTML. Jetez un coup d'oeil à la source, faites-en un essai et si cela fonctionne pour vous, allez-y et copiez-le.

+1

oui, que des situations peuvent se produire. J'aurais dû le mentionner dans la question. de toute façon j'ai trouvé une solution plus facile, en utilisant jQuery! :RÉ – Alex

1
$searchString = 'foo bar'; 
$searchResult = '<p>bla bla foo bar bla</p>'; 

var_dump(str_replace($searchString, '<span>'.$searchString.'</span>', $searchResult)); 

var_dump(preg_replace('/'.$searchString.'/', '<span>'.$searchString.'</span>', $searchResult)); 
1

Si vous assurez-vous que le terme de recherche lui-même ne contient aucune HTML, vous pouvez aller tout droit et l'envelopper dans "<span>" avec l'aide de str_replace().

Notez que c'est l'une des très rares occasions où le traitement du code HTML via les fonctions de chaîne n'est pas mauvais en soi. Si le terme de recherche peut contenir du HTML (c'est-à-dire que la surbrillance peut recouvrir des bordures de balise), les choses deviennent beaucoup plus compliquées et vous ne vous en tirerez pas avec un raccourci intelligent comme celui ci-dessus.

+1

bien il y a un autre problème. par exemple. la sortie peut avoir '', puis le balisage se décompose. – Alex

+0

@Alex: Ceci est vrai, et c'est exactement la raison pour laquelle l'utilisation de la manipulation de base de chaîne est généralement considérée comme un non-non pour travailler avec HTML. Cela dépend beaucoup de vos données si cette approche simpliste est viable ou non. Si le commentaire peut contenir * n'importe quel * HTML, vous êtes dans le coin "beaucoup plus compliqué" très rapidement. – Tomalak

7

simple Rechercher et remplacer:

$resultHTML = str_replace($searchString, '<span class="highlight">'.$searchString.'</span>', $resultHTML); 
+1

http://php.net/manual/fr/function.str-replace.php –

+4

Ne pas oublier qu'il existe une version insensible à la casse aussi ... str_ireplace – jocull

+0

bon ... j'ai trouvé –

2
<?php 

$result = "<p>Bla bla foo bar bla bla test x x x</p>"; 

$query = "foo bar"; 

// The important point here is, USE single quote (') in replacement part!! 
echo preg_replace("/($query)/", '<span class="highlight">${1}</span>', $result); 
+1

Vous pouvez utiliser double citations aussi, il faut juste leur échapper. Pour plus d'informations - http://en.wikipedia.org/wiki/Escape_character – jolt

+0

merci .. cela fonctionne comme charme pour meee ... –

1

J'ai eu la même question, mais je trouve this

Le code est conçu pour changer de façon aléatoire les couleurs de surbrillance, mais cela se fait par une fonction, il est donc facile de modifier d'utiliser une seule couleur:

 $color = '#FCB514'; //self::generate_colors(); 

Premier message!

0

ombre de texte: 1px 1px 1px # FCD600;