2010-05-05 8 views
0

Je me bats un peu avec cette expression régulière et je me demandais si quelqu'un était sur le point de m'aider s'il vous plaît?Expression régulière trouver une phrase pas dans une balise HTML

Ce que je dois faire est d'isoler la 1ère phrase à l'intérieur d'une chaîne qui n'est pas dans une balise HTML. Ainsi, les exemples que j'ai en ce moment sont:

This is some test text about <acronym 
title="Incomplete Test Syndrome" 
class="CustomClass">ITS</acronym> for 
the **ITS** department. Also worth 
mentioning ABS as well I guess.ITS, 

... et ...

This is some **ITS** test text about 
<acronym title="Incomplete Test 
Syndrome" 
class="GOTManager">ITS</acronym> for 
the ITS department. Also worth 
mentioning ABS as well I guess 

Ainsi, dans le premier exemple que je veux ignorer l'ITS enveloppées et me donner l'ITS à la fin de la 1ère phrase.

Dans le deuxième exemple, je veux que l'ITS retourne au début de la 2ème phrase.

L'objectif est de les remplacer par mes propres étiquettes d'acronymes personnalisées dans une application ColdFusion que j'écris.

Merci beaucoup, James

+6

[VOUS NE POUVEZ PAS PARSE DU HTML EN UTILISANT DES EXPRESSIONS NORMALES] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags)! – SLaks

+0

Je ne veux pas analyser le HTML. –

+0

@James: vous ne pouvez pas * vouloir * analyser HTML, mais vous devrez atteindre ces résultats. – FrustratedWithFormsDesigner

Répondre

3

Comme les commentateurs l'ont souligné, les expressions régulières ne sont pas un bon outil pour travailler avec XML/HTML textes semblables. C'est parce qu'être «à l'intérieur» de quelque chose est très difficile à vérifier dans n'importe quelle généralité (vous ne savez jamais dans lequel de ces niveaux d'imbrication illimités possibles vous êtes).

Pour vos exemples particuliers, cependant, c'est possible. Cela dépend fortement de ne pas avoir de balises imbriquées. Si vous le faites, vous devriez sérieusement essayer une approche différente.

Vos exemples fonctionnent avec

^(?:<[^<]*<[^>]*>|.)*?(ITS) 

Cela correspond à la chaîne entière jusqu'à la première occurrence de STI pas dans une balise (et a cela dans son premier groupe de capture), mais il devrait être facile d'extraire le les données dont vous avez besoin ici. Seule la correspondance de cette instance de ITS n'est pas possible, car votre implémentation d'expressions régulières ne prend pas en charge les suivis de longueur arbitraire.

Demandez si vous voulez/besoin de l'expression expliquée. =)

0

Je vais vous dire la même chose que je vous ai dit quand vous avez posé une question similaire: Stuck with Regular Expression code to apply HTML tag to text but exclude if inside <?> tag

Vous ne peut pas analyser HTML, y compris des éléments imbriqués, avec pures expressions régulières. C'est une limitation connue de regex et est bien documentée.

Vous pouvez essayer d'installer et d'utiliser un moteur d'expressions régulières externe avec des extensions, ce qui peut fonctionner. Vous pouvez manuellement parcourir la chaîne, en comptant l'imbrication pour voir si la chaîne que vous regardez est encapsulée. Vous pouvez utiliser un analyseur HTML authentique, comme le font WebKIT en externe.

Mais vous ne pouvez pas le faire avec regex. S'il vous plaît chercher une alternative. Heck, nous allons même aider.

0

Vous dites:

Le but est de les remplacer par mes propres tags acronyme enveloppées personnalisés dans une application ColdFusion j'écris.

Il semble que l'utilisation de XSL soit plus appropriée que la regex pour transformer une balise en une autre.

MISE À JOUR:

juste jeté cela ensemble, il semble fonctionner pour les cas simples:

(NOTE:. Ce dépouillera simplement les balises « acronyme » Vous pouvez utiliser XSL pour remplacer les avec vos propres étiquettes personnalisées, mais vous ne spécifiez pas quoi que ce soit le long de ces lignes, donc je ne l'ai pas entrer dans cela)

XSL:

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="*[name() = 'acronym']" /> 
</xsl:stylesheet> 

Entrée:

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
This is some test text about <acronym 
title="Incomplete Test Syndrome" 
class="CustomClass">ITS</acronym> for 
the **ITS** department. Also worth 
mentioning ABS as well I guess.ITS, 

This is some **ITS** test text about 
<acronym title="Incomplete Test 
Syndrome" 
class="GOTManager">ITS</acronym> for 
the ITS department. Also worth 
mentioning ABS as well I guess 
</root> 

Sortie:

<?xml version="1.0" encoding="UTF-8"?> 
This is some test text about for 
the **ITS** department. Also worth 
mentioning ABS as well I guess.ITS, 

This is some **ITS** test text about 
for 
the ITS department. Also worth 
mentioning ABS as well I guess 

MISE À JOUR:

Vous avez dit:

Ainsi, dans le premier exemple que je veux qu'il ignorer la enveloppe ed ITS et donnez-moi le ITS à la fin de la 1ère phrase. Dans le deuxième exemple, je souhaite que renvoie l'ITS au début de la deuxième phrase .

Cela n'a aucun sens. Votre deuxième exemple n'a pas "ITS" dans la deuxième phrase. Je pense ce que vous vouliez dire était que le **ITS** est ce que vous voulez avoir extrait.

L'échantillon XSL j'ai donné que des bandes les <acronym/> étiquettes, mais après cela est fait, vous pouvez essayer de trouver le ITS à différents points dans la phrase et peut-être pour cela une expression régulière pourrait être facile (cela suppose que vous êtes seulement nous s'inquiéter des étiquettes <acronym/>).

Questions connexes