2014-07-02 12 views
5

ZadanieWymień wszystkie przestrzenie w treści każdej z tagiem ``  

Wymień wszystkie przestrzenie w treści każdej tag  .

y.html (przykładowy plik)

<p class=MsoNormal style='margin-top:1.0pt;margin-right:0cm;margin-bottom:1.0pt; 
margin-left:34.0pt;text-indent:-19.8pt'><span lang=NL-BE style='font-size:10.0pt; 
font-family:Symbol;color:black;mso-ansi-language:NL-BE'>·</span><span 
class=GramE><span style='font-size:7.0pt;color:black'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</span><span style='font-size:10.0pt;font-family:Arial;color:black'>Kit</span></span><span 
style='font-size:10.0pt;font-family:Arial;color:black'> </span><span 
class=SpellE><i><span style='font-size:10.0pt;font-family:Arial'>Strongyloides</span></i></span><i><span 
style='font-size:10.0pt;font-family:Arial'> <span class=SpellE>ratti</span></span></i><span 
style='font-size:10.0pt;font-family:Arial'> (nr. 9450) van <span class=SpellE>Bordier</span> 
Affinity Products. </span><span lang=NL-BE style='font-size:10.0pt;font-family: 
Arial;mso-ansi-language:NL-BE'>Zie bijsluiter in bijlage: CLKB_B_0306. Te 
bewaren bij 2 – 8 °C tot vervaldatum.</span><span lang=NL-BE style='mso-ansi-language: 
NL-BE'><o:p></o:p></span></p> 

Co próbowałem

#!/usr/bin/perl 
use strict; 
use warnings; 
use Mojo::DOM; 
open (my $fh, "<", "y.html") or die $!; 
my $dom = Mojo::DOM->new(do{local $/ = undef; <$fh>}); 
$dom->find("*")->each(sub { $_->content($_->content =~ s/\s/\&nbsp;/gr) }); 
print $dom; 

wynika z wyżej skrypcie

<p class="MsoNormal" style="margin-top:1.0pt;margin-right:0cm;margin-bottom:1.0pt; 
margin-left:34.0pt;text-indent:-19.8pt"><span&nbsp;lang="nl-be"&nbsp;style="font-size:10.0pt;&nbsp;font-family:symbol;color:black;mso-ansi-language:nl-be">·<span&nbsp;class="grame"><span&nbsp;style="font-s 
ize:7.0pt;color:black">   <span&nbsp;style="font-size:10.0pt;font-family:arial;color:black">Kit<span&nbsp;style="font-size:10.0pt;font-family:arial;color:black"> <span&nbsp;class="spelle"><i><span&nb 
sp;style="font-size:10.0pt;font-family:arial">Strongyloides<i><span&nbsp;style="font-size:10.0pt;font-family:arial"> <span&nbsp;class="spelle">ratti<span&nbsp;style="font-size:10.0pt;font-family:arial"> (n 
r. 9450) van <span&nbsp;class="spelle">Bordier Affinity Products. <span&nbsp;lang="nl-be"&nbsp;style="font-size:10.0pt;font-family:&nbsp;arial;mso-ansi-language:nl-be">Zie bijsluiter in bijlage: CLKB_B_030 
6. Te bewaren bij 2 – 8 °C tot vervaldatum.<span&nbsp;lang="nl-be"&nbsp;style="mso-ansi-language:&nbsp;nl-be"><o:p></o:p></span&nbsp;lang="nl-be"&nbsp;style="mso-ansi-language:&nbsp;nl-be"></span&nbsp;lang 
="nl-be"&nbsp;style="font-size:10.0pt;font-family:&nbsp;arial;mso-ansi-language:nl-be"></span&nbsp;class="spelle"></span&nbsp;style="font-size:10.0pt;font-family:arial"></span&nbsp;class="spelle"></span&nb 
sp;style="font-size:10.0pt;font-family:arial"></i></span&nbsp;style="font-size:10.0pt;font-family:arial"></i></span&nbsp;class="spelle"></span&nbsp;style="font-size:10.0pt;font-family:arial;color:black"></ 
span&nbsp;style="font-size:10.0pt;font-family:arial;color:black"></span&nbsp;style="font-size:7.0pt;color:black"></span&nbsp;class="grame"></span&nbsp;lang="nl-be"&nbsp;style="font-size:10.0pt;&nbsp;font-f 
amily:symbol;color:black;mso-ansi-language:nl-be"></p> 

Nie otrzymuję pożądanego wyniku, dodaje się również tag &nbsp; (np. </span&nbsp;), chcę, żeby to było zrobione tylko w treści.

PS: Próbowałem go z Mojo::DOM, ale nie trzeba go używać, możesz wypróbować dowolny inny analizator składni, jeśli chcesz, nadal chciałbym wiedzieć, co jest nie tak z moim kodem?

Odpowiedz

4

Jest to praca, w której tokenizacja danych wejściowych ułatwia pracę. I dlatego doradza przy użyciu HTML::TokeParser

#!/usr/bin/perl 
use strict; 
use warnings; 
use utf8; 

use HTML::TokeParser; 

my $data = do {local $/; <DATA>}; 

my $p = HTML::TokeParser->new(\$data); 

while (my $token = $p->get_token) { 
    if ($token->[0] eq 'T') { 
     my $text = $token->[1]; 
     $text =~ s/ /&nbsp;/g; 
     print $text; 
    } else { 
     print "$token->[-1]"; 
    } 
} 

__DATA__ 
<html> 
<body> 
<p class=MsoNormal style='margin-top:1.0pt;margin-right:0cm;margin-bottom:1.0pt; 
margin-left:34.0pt;text-indent:-19.8pt'><span lang=NL-BE style='font-size:10.0pt; 
font-family:Symbol;color:black;mso-ansi-language:NL-BE'>·</span><span 
class=GramE><span style='font-size:7.0pt;color:black'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</span><span style='font-size:10.0pt;font-family:Arial;color:black'>Kit</span></span><span 
style='font-size:10.0pt;font-family:Arial;color:black'> </span><span 
class=SpellE><i><span style='font-size:10.0pt;font-family:Arial'>Strongyloides</span></i></span><i><span 
style='font-size:10.0pt;font-family:Arial'> <span class=SpellE>ratti</span></span></i><span 
style='font-size:10.0pt;font-family:Arial'> (nr. 9450) van <span class=SpellE>Bordier</span> 
Affinity Products. </span><span lang=NL-BE style='font-size:10.0pt;font-family: 
Arial;mso-ansi-language:NL-BE'>Zie bijsluiter in bijlage: CLKB_B_0306. Te 
bewaren bij 2 – 8 °C tot vervaldatum.</span><span lang=NL-BE style='mso-ansi-language: 
NL-BE'><o:p></o:p></span></p> 
</body> 
</html> 

Wyjścia:

<html> 
<body> 
<p class=MsoNormal style='margin-top:1.0pt;margin-right:0cm;margin-bottom:1.0pt; 
margin-left:34.0pt;text-indent:-19.8pt'><span lang=NL-BE style='font-size:10.0pt; 
font-family:Symbol;color:black;mso-ansi-language:NL-BE'>·</span><span 
class=GramE><span style='font-size:7.0pt;color:black'>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
</span><span style='font-size:10.0pt;font-family:Arial;color:black'>Kit</span></span><span 
style='font-size:10.0pt;font-family:Arial;color:black'>&nbsp;</span><span 
class=SpellE><i><span style='font-size:10.0pt;font-family:Arial'>Strongyloides</span></i></span><i><span 
style='font-size:10.0pt;font-family:Arial'>&nbsp;<span class=SpellE>ratti</span></span></i><span 
style='font-size:10.0pt;font-family:Arial'>&nbsp;(nr.&nbsp;9450)&nbsp;van&nbsp;<span class=SpellE>Bordier</span> 
Affinity&nbsp;Products.&nbsp;</span><span lang=NL-BE style='font-size:10.0pt;font-family: 
Arial;mso-ansi-language:NL-BE'>Zie&nbsp;bijsluiter&nbsp;in&nbsp;bijlage:&nbsp;CLKB_B_0306.&nbsp;Te 
bewaren&nbsp;bij&nbsp;2&nbsp;–&nbsp;8&nbsp;°C&nbsp;tot&nbsp;vervaldatum.</span><span lang=NL-BE style='mso-ansi-language: 
NL-BE'><o:p></o:p></span></p> 
</body> 
</html> 
+0

Dzięki, że działa poprawnie. Czy nie można go rozwiązać za pomocą Mojo :: DOM? –

+0

wiesz, jak bardzo doceniam 'Mojo :: DOM', ale nie sądzę, że to odpowiednie narzędzie do pracy. Jeśli jednak chciałbyś zastąpić tylko sekcję drzewa DOM, prawdopodobnie poleciłbym użyć Mojo :: DOM do przechodzenia i znajdowania właściwej gałęzi, a następnie użycie 'HTML :: TokeParser' do zastąpienia spacji w tej gałęzi używając '-> content", tak jak początkowo próbowałeś. – Miller

+1

Wiem, to samo tutaj :). Wiedziałem też, że będziesz pierwszym, który odpowie na to pytanie;) jesteś bardzo aktywny! Tak, to także sposób na zrobienie tego. W każdym razie użyłem twojego podejścia używając 'HTML :: TokeParser' i wykonałem zadanie. Miłego dnia! –