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>
È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top