Schrift
[thread]12085[/thread]

RegEx: Zeichenfolge darf in Zeichenkette nich vorkommen

Tags: Ähnliche Threads

Leser: 1


<< >> 10 Einträge, 1 Seite
burnersk
 2008-06-26 13:34
#111544 #111544
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
Hi,

ich habe ein Problem... ;)
Wenn ich folgende Zeichenkette habe:
Code: (dl )
<if ($if_eq > 0)><li><tpl src="if_eq.tpl" /></li></if>
und darauf den RegEx
Code (perl): (dl )
$template_code =~ m/<if \(([^\)]+)\)>(.*)<\/if>/is
anwende, erhalte ich:
Code (perl): (dl )
1
2
$1 = q~$if_eq > 0~;
$2 = q~<li><tpl src="if_eq.tpl" /></li>~


Meine Vorgabe ist, die innerste <if>-Anweisung zuerst abzuarbeiten. Blos wenn <if>-Anweisungen geschachtelt werden, kommt alles durcheinander.

Wie kann ich dem RegEx sagen, dass im $2-Bereich kein
Code (perl): (dl )
<if \(([^\)]+)\)>
vorkommen darf.

Ich habe das in einer while:
Code (perl): (dl )
1
2
3
4
5
6
7
while($template_code =~ m/<if \(([^\)]+)\)>(.*)<\/if>/is) {
    my $expr_if = $1;
    my $content_true = $2;
    my $content_false = '';
    
    warn($1, $2);
  }
burnersk
 2008-06-26 13:36
#111545 #111545
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
Anmerkung:
Die <if>-Anweisung kann auch in mehreren Zeilen stehen:
Code: (dl )
1
2
3
4
5
<if ($if_eq > 0)>
<li>
<tpl src="if_eq.tpl" />
</li>
</if>


Ich weiß, es ist gerade eine Endlosschleife (kein Ersetzen).
renee
 2008-06-26 13:51
#111546 #111546
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wie sieht denn so etwas verschachteltes aus? Was soll dann das Ergebnis sein?
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
burnersk
 2008-06-26 13:53
#111548 #111548
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
renee+2008-06-26 11:51:23--
Wie sieht denn so etwas verschachteltes aus? Was soll dann das Ergebnis sein?


Code: (dl )
1
2
3
4
5
6
7
8
<if ($if_eq == 1)>
<li>
<if ($ueberschrift == 1)>
<h4>"IF"-Funktionalit&auml;t (<em>EQUAL</em>)</h4>
</if>
<tpl src="if_eq.tpl" />
</li>
</if>



Ergebnis bei $if_eq=1, $ueberschrift=0:
Code: (dl )
1
2
3
  <li>
<tpl src="if_eq.tpl" />
</li>
renee
 2008-06-26 13:58
#111549 #111549
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Generell würde ich Dir raten, auf bestehende Template-Systeme (wie z.B. CPAN:HTML::Template::Compiled) zurückzugreifen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
moritz
 2008-06-26 14:01
#111550 #111550
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Oder wenn man es unbedingt selbst bauen muss, einen ordentlichen rekursiv absteigenden Parser zu nehmen. Reguläre Ausdrücke eignen sich nicht für verschachtelte Konstrukte.
murphy
 2008-06-26 18:17
#111558 #111558
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
moritz+2008-06-26 12:01:06--
[...] Reguläre Ausdrücke eignen sich nicht für verschachtelte Konstrukte.


Seit Perl 5.10 sind die regulären Ausdrücke effektiv PEGs und eignen sich folglich auch für verschachtelte Konstrukte und komplette Parser, wenn man möchte.

Die wichtigen neuen Regexkonstrukte sind (?>...) und (?N), wobei N die Nummer einer geklammerten Gruppe ist.
When C++ is your hammer, every problem looks like your thumb.
moritz
 2008-06-26 19:40
#111571 #111571
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
murphy+2008-06-26 16:17:23--
moritz+2008-06-26 12:01:06--
[...] Reguläre Ausdrücke eignen sich nicht für verschachtelte Konstrukte.


Seit Perl 5.10 sind die regulären Ausdrücke effektiv PEGs und eignen sich folglich auch für verschachtelte Konstrukte und komplette Parser, wenn man möchte.


Die Botschaft hör ich wohl, allein es fehlt der Glaube.

Als ich nach dem Release von perl-5.10 probiert habe, so eine "regex" für XML zu bauen habe ich erst mal zwei Bugs in der Regex-Engine entdeckt, und habe festgestellt, dass es, auch wenn man mal gerade nicht auf bugs trifft, verdammt hart ist, diese Dinger zu debuggen.

Z.B. kann man sich nicht einfach ein stack-trace ausgeben lassen um zu sehen, in welcher Verschatelung die einzelnen Teile der "Regex" gematcht haben.

Auch ist es komisch, wenn nicht-backtrackende Gruppen (?>...) auf einmal langsamer sind als backtrackende.

Ich bleibe also dabei, dass "geeignet" was anderes ist.

Update: ach ja, ausserdem will man ja beim parsen einen Parse-Tree bauen, und das kann man in den 5.10er-regexes nur dann, wenn man (?{...}) Assertions benutzt, die immer noch als "experimental" gelten und z.B. viele Scoping-Bugs haben. Kein Spass.
murphy
 2008-06-26 20:54
#111578 #111578
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
@moritz: Ich habe nie behauptet, dass das ein stabiles Feature ist, sondern wollte nur erwähnen, dass es existiert :-)
When C++ is your hammer, every problem looks like your thumb.
burnersk
 2008-06-27 10:06
#111582 #111582
User since
2008-03-25
83 Artikel
BenutzerIn
[default_avatar]
Es gibt doch sicherlich in der CPAN irgendwo ein Modul, welches sowas parsen kann.
Also hole mir die innerste Anweisung oder so...

Kennt sich jemand da aus?
<< >> 10 Einträge, 1 Seite



View all threads created 2008-06-26 13:34.