2010-03-08 4 views
0

J'ai écrit un petit script de recherche pour un client, cela fonctionne et les mots se highlited, mais ...mots Highlite de searchstring

Imaginez cette situation:

terme de recherche: test

résultat trouvé : Hello this <a href="/news/this-is-a-test">is a test</a>

dans cet exemple, les deux « test » dans la partie href et entre les balises <a> obtenir highlited, briser le lien.

Comment pourrais-je empêcher cela?

Edit:

Alors voici ce que j'ai besoin: Une regex remplacer la fonction qui remplace toutes les chaînes de recherche avec correspondance SAUF ceux qui sont situés à l'intérieur d'un attribut href

+0

Publiez votre recherche et remplacer le code. – codaddict

Répondre

0

Got it!

$body = $row['body']; 
$pattern = "/".$search_string."(?!([^<]+)?>)/i"; 
$replacement = "<strong class='highlite'>".$search_string."</strong>"; 
$altered_body = preg_replace($pattern, $replacement, $body); 

print($altered_body); 
1

Vous ne pouvez pas analyser XML avec des expressions régulières. :(Si vous voulez une solution regex sale qui fonctionne encore dans de nombreux cas, vous pouvez essayer cette regex.

">[^<]*?(test)" 

D'abord, vous regardez une accolade fermante d'étiquette et que vous assurez-vous qu'aucune autre balise est ouverte entre les deux.

Idéalement vous voulez analyser HTML et de ne remplacer que les parties textuelles de celui-ci.

+0

Oui en effet, je dois analyser HTML et remplacer les parties textuelles seulement. > [^ <] *? (Test) est alors la meilleure solution? – Bundy