Cerca e sostituisci i contenuti testuali di un tag
Domanda
Sto provando in modo specifico a riempire il / 's nel testo di un tag.
1234/1234/ABCDE => 1234 / 1234 / ABCDE
Nel contesto; se ho un tag:
<a href="http://www.domain.com/path/to/page.html">12 34/1234A/BC DEFG</a>
Vorrei ottenere:
<a href="http://www.domain.com/path/to/page.html">12 34 / 1234A / BC DEFG</a>
Soluzione
Questo Regex dovrebbe fare il trucco:
(\s*/\s*(?=[^<>]+<))
Sostituirà solo il '/'
all'interno dei tag e non degli URL.
In C #:
myHtml = Regex.Replace(myHtml, @"(\s*/\s*(?=[^<>]+<))", " / ");
In Perl:
$myHtml =~ s!(\s*/\s*(?=[^<>]+<))! / !g;
In JavaScript:
myHtml = myHtml.replace(/(\s*\/\s*(?=[^<>]+<))/g, " / ");
Nota:
in questi esempi, l'intero documento deve essere caricato nella stringa myHtml
.
Se lavori su una singola riga alla volta, ovviamente non funzionerà se ci sono newline all'interno dei tag o coppie di tag intermedie.
Altri suggerimenti
Questo non è proprio il tipo di cose che le espressioni regolari sono brave a fare. Probabilmente starai meglio usando un parser HTML o XML: crea un albero di nodi fuori dal documento, quindi puoi semplicemente scorrere tutti i nodi di testo all'interno dei tag e aggiungere spazi se necessario.
Se necessario, puoi provare a utilizzare una regex per estrarre il testo tra due tag, quindi elaborarlo e quindi reinserirlo, ma questa attività è probabilmente più complicata di una singola regex a causa dei tuoi vincoli.
Ecco qualcosa in Perl che funziona (ma non usa regex):
my (@a, $in_tag);
foreach(split //, $string) { # assuming $string holds our string
$in_tag = 1 if Se necessario, puoi provare a utilizzare una regex per estrarre il testo tra due tag, quindi elaborarlo e quindi reinserirlo, ma questa attività è probabilmente più complicata di una singola regex a causa dei tuoi vincoli.
Ecco qualcosa in Perl che funziona (ma non usa regex):
<*>
Questo, tuttavia, non è un regex, ma un parser molto semplice.
eq "<";
$in_tag = 0 if Se necessario, puoi provare a utilizzare una regex per estrarre il testo tra due tag, quindi elaborarlo e quindi reinserirlo, ma questa attività è probabilmente più complicata di una singola regex a causa dei tuoi vincoli.
Ecco qualcosa in Perl che funziona (ma non usa regex):
<*>
Questo, tuttavia, non è un regex, ma un parser molto semplice.
eq ">";
if( Se necessario, puoi provare a utilizzare una regex per estrarre il testo tra due tag, quindi elaborarlo e quindi reinserirlo, ma questa attività è probabilmente più complicata di una singola regex a causa dei tuoi vincoli.
Ecco qualcosa in Perl che funziona (ma non usa regex):
<*>
Questo, tuttavia, non è un regex, ma un parser molto semplice.
eq "/" and not $in_tag) {
push @a, " ", "/", " ";
}
else {
push @a, Se necessario, puoi provare a utilizzare una regex per estrarre il testo tra due tag, quindi elaborarlo e quindi reinserirlo, ma questa attività è probabilmente più complicata di una singola regex a causa dei tuoi vincoli.
Ecco qualcosa in Perl che funziona (ma non usa regex):
<*>
Questo, tuttavia, non è un regex, ma un parser molto semplice.
;
}
}
$string = join "", @a;
Questo, tuttavia, non è un regex, ma un parser molto semplice.
Penso che ci manchi un po 'di contesto qui. I dati sono HTML, XML o solo frammenti di testo con tag?
Se si tratta di HTML o XML, come menzionato spesso, regexps non è sicuro, a meno che non si controlli esattamente il formato dei dati e si sappia che lo si controllerà sempre. E lo documentate.
Userei un parser appropriato se fossi in te. Se hai installato Perl e XML :: Twig, il seguente one-liner farà:
perl -MXML::Twig -e'XML::Twig->parse( keep_spaces => 1, "my_file.xml")->subs_text( "/", " / ")->print'
Se hai a che fare con XML ben formato senza commenti e senza sezioni CDATA, un modo più efficiente sarebbe usare PYX (devi installare XML :: PYX):
pyx my_file.xml | perl -p -e's{/}{ / }g if m{-}' | pyxw
Quale lingua?
In Perl, prova s / \ // \ / / g
.