Portál AbcLinuxu, 10. května 2025 11:08

Dotaz: Perl a vyhledani spec. znaků

25.5.2010 00:16 LuRy | skóre: 12
Perl a vyhledani spec. znaků
Přečteno: 231×
Odpovědět | Admin

Ahoj, omlouvam se ze znova otravuju ale resim problem kdy mi perlovy skript vyhodi chybu a ukonci se nebo v lepsim pripade mi ignoruje hledany vyraz. jendá se o výraz

foreach my $smajl1(@smajly){
if ($msg =~ /<img src="http:\S\Simc.lide.cz\Ssmiles\S$smajl1.gif" alt="(.*?)" height="15" width="15" \/>/i) {
$smajlpopisek[$a] = $1;
$a++;
}
}

print "POPISEK $smajlpopisek[0], $smajlpopisek[1], => $popiseksmajlu\n"; 

kde v poli @smajly mam paříklad

<img src="http://imc.lide.cz/smiles/42C2D0DBB105D8E601010000.gif"  alt="cože???..." height="15" width="15" />

v pripade kdy neni v tagu "alt="neco"" zadny specialni znak nebo znak s diakritikou jde to dobre ale jakmile tam je neco jinyho skript spadne nejcastejci s hlaskou
Nested quantifiers in regex; marked by <-- HERE in m/coże??? <-- HERE .../ at C:\Robotek\kick.bot\bot.pl line 1996.

zkousel sem ruzne vyranty reg. vyrazu ale neprichazim na reseni. Mužete někdo prosím poradit?


Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

25.5.2010 06:14 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků
Odpovědět | | Sbalit | Link | Blokovat | Admin
"???" se interpretuje jako část regexpu.

Potřebujete $smajl1 ohraničit: \Q$smajl1\E.

Pokud chcete správně zpracovat diakritiku použijte encode() a decode() při vstupu a výstupu řetězců z programu.
In Ada the typical infinite loop would normally be terminated by detonation.
25.5.2010 08:03 LuRy | skóre: 12
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků
asi sem nepocohpil spravne ... $lsmajl1 je tam jako upresneni o kterej vyraz jde a potrebuju vyhledat to co je mezi uvozovkama tagu alt
Řešení 1× (misch)
25.5.2010 12:51 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků
Mně je dost jedno, jaký to má hlubší význam, ale ten kód jak máte v příkladu "padá" pro důvod (+oprava) viz můj příspěvek výše.

Takže pro jistotu ještě jednou:

\S$smajl1.gif

má být

\S\Q$smajl1\E.gif

O diakritice jste se také zmínil, tudíž jsem poskytl vodítko.
In Ada the typical infinite loop would normally be terminated by detonation.
25.5.2010 19:18 LuRy | skóre: 12
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků
zkusil sem to .. pro zmenu to nic nevypsalo
25.5.2010 21:03 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků
V tom případě asi nejsme na stejném příkladu... zkuste sem hodit nějaký kompletní minimální program a jeho očekávaný výstup?
In Ada the typical infinite loop would normally be terminated by detonation.
25.5.2010 22:24 LuRy | skóre: 12
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků
#$msg = '<img src="http://imc.lide.cz/smiles/456954032FAAA52E98010000.gif" alt="aa" height="15" width="15">';
$msg = '<img src="http://imc.lide.cz/smiles/456954032FAAA52E98010000.gif" alt=":)" height="15" width="15">test<img src="http://imc.lide.cz/smiles/3F866B27EB26DB61B9000000.gif" alt=":-DD" height="15" width="15"> <img src="http://imc.lide.cz/smiles/42C2D0DBB105D8E601010000.gif" alt="cože???..." height="15" width="15">';
my @smajly = ($msg =~ /"http:\S\Simc.lide.cz\Ssmiles\S([A-Z0-9]+).gif"/g); # <<
my @popisek = ($msg =~ /alt="(.+)" height="15" width="15 \S>"/g);
my $a=0;
my @opravenejsmajl;
my @smajlpopisek;
$opravenejsmajl[0] = "111";
$opravenejsmajl[1] = "112";
$opravenejsmajl[2] = "113";

foreach my $smajl1 (@smajly){
if ($msg =~ /<img src="http:\S\Simc.lide.cz\Ssmiles\S\Q$smajl1\E.gif" alt="(.*?)" height="15" width="15">/i) {
$smajlpopisek[$a] = $1;
print "POPISEK: ".$1."\n";
}
$a++;

}

$a = 0;
foreach my $cislosmajlik (@smajly){
$msg =~ s/<img src="http\S\S\Simc.lide.cz\Ssmiles\S\Q$cislosmajlik\E.gif" alt="\Q$smajlpopisek[$a]\E" height="15" width="15">/:$opravenejsmajl[$a]:/;
$a++;
}
print "\n\nMSG: ".$msg;


Už sme pochopil vsem byl hacek nedošlo mi že to musim hodit ke kazde proměné jinak tady je kompletni funkční řešení
25.5.2010 22:25 LuRy | skóre: 12
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků
opět díky moc :) v regulakach pořád tápu nevím
25.5.2010 08:15 LuRy | skóre: 12
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků
a o zpracovani diakritiky se starat nemusim porovnavam nazev smajlu v podobnem pripade potrebuju aby mi ho to vubec vypsalo :D coz se mi zatim nedari
25.5.2010 08:50 Jan Šimák | skóre: 37 | Hradec Králové
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků
my $msg = 'img src="http://imc.lide.cz/smiles/42C2D0DBB105D8E601010000.gif" alt="cože???..." height="15" width="15"';

print $1 if $msg =~ /alt="([^"]*)"/;
25.5.2010 15:46 LuRy | skóre: 12
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků

Nested quantifiers in regex; marked by <-- HERE in m/<img src="http\S\S\Simc.lide.cz\Ssmiles\S42C2D0DBB105D8E601010000.gif" alt="coże??? <-- HERE ..." height="15" width="15" />/ at C:\Robotek\kick.bot\bot.pl line 1997.

25.5.2010 18:36 l4m4
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků
Error between chair and keyboard.

V tom, co napsal honza-S, se $msg nikde nepoužívá v roli regexpu. Takže pokud dostáváš tuto chybu, děláš namísto toho kdovíco.
25.5.2010 19:17 LuRy | skóre: 12
Rozbalit Rozbalit vše Re: Perl a vyhledani spec. znaků
ja si to upravil do kodu aby to sedelo :)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.