Schrift
[thread]8909[/thread]

RegEx: Platzhalter ersetzen klappt nicht (Seite 3)

Leser: 1


<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten
Lightman
 2007-04-11 20:44
#75753 #75753
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Naja, wenn der Match nicht ersetzt wird, steht einfach <% ... %> in der HTML-Datei. Eine Exception wäre zwar auch nicht schlecht -- da hast Du schon recht -- aber es gibt auch Situationen, wo ein einfaches Überspringen sinnvoll sein kann. Nebenbei ist mir aufgefallen, dass ich zwei Klammern vergessen habe: (<%\s*(\S+?)\s*%>)
Funktioniert jetzt aber wirklich. :)\n\n

<!--EDIT|Lightman|1176309874-->
PerlProfi
 2007-04-11 20:51
#75754 #75754
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Wieso sollte da noch eine Klammer drum kommen?
Lightman
 2007-04-11 21:03
#75755 #75755
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Ich hätte vielleicht mal den gesamten Ausdruck posten sollen (sorry):
$_ =~ s/(<%\s*(\S+?)\s*%>)/exists $HASH{$2} ? $HASH{$2} : $1/eg;

Es soll bei FALSE ja nicht $_ sondern der Match zurückgegeben werden.
PerlProfi
 2007-04-11 21:10
#75756 #75756
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Okay, ich dachte Anfang und Ende hättest du noch in der RegExp festgelegt.
Lightman
 2007-04-11 21:28
#75757 #75757
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Meinst Du /^ und $/ ? Wenn ja: Das ist eher ungünstig, weil die Platzhalter auch eingebettet sein können (<div><% blubb %></div>).
PerlProfi
 2007-04-11 21:40
#75758 #75758
User since
2006-11-29
340 Artikel
BenutzerIn
[default_avatar]
Ja an die hatte ich gedacht, weil am Anfang nur von Arrayelementen die Rede war, welche in der Form <% ... %> vorliegen können.
Lightman
 2007-04-11 21:41
#75759 #75759
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Das sollte nur ein vereinfachtes Beispiel sein, um meine Frage übersichtlicher zu halten. ;)
GwenDragon
 2007-04-11 23:06
#75760 #75760
User since
2005-01-17
14835 Artikel
Admin1
[Homepage]
user image
Auch wenn es etwas OT ist:
Ich würde lieber wegen der Schnelligkeit anstatt des Regex substr() und index() nehmen, um die Inhalte der <% %>-Klammern zu bekommen. Das ist um einiges schneller beim Parsen.
Soll doch wohl für ein Templatesystem sein, oder ;)
Lightman
 2007-04-11 23:22
#75761 #75761
User since
2007-01-31
57 Artikel
BenutzerIn
[default_avatar]
Ja, es ist für ein (kleines) Template-System. Auch wenn insgesamt max. 10 Platzhalter ersetzt werden und es Performance-technisch keinen Unterschied machen wird: Warum ist substr() und index() schneller als RegEx? (Und was ist index()? $ perldoc index -> No documentation found for "index")
GwenDragon
 2007-04-11 23:39
#75762 #75762
User since
2005-01-17
14835 Artikel
Admin1
[Homepage]
user image
Beides Zeichenkettenfunktionen.

perldoc -f index
Quote
index STR,SUBSTR,POSITION
index STR,SUBSTR
The index function searches for one string within another, but
without the wildcard-like behavior of a full regular-expression
pattern match. It returns the position of the first occurrence
of SUBSTR in STR at or after POSITION. If POSITION is omitted,
starts searching from the beginning of the string. The return
value is based at "0" (or whatever you've set the "$[" variable
to--but don't do that). If the substring is not found, returns
one less than the base, ordinarily "-1".


perldoc -f substr
Quote
substr EXPR,OFFSET,LENGTH,REPLACEMENT
substr EXPR,OFFSET,LENGTH
substr EXPR,OFFSET
Extracts a substring out of EXPR and returns it. First character
is at offset "0", or whatever you've set "$[" to (but don't do
that). If OFFSET is negative (or more precisely, less than
"$["), starts that far from the end of the string. If LENGTH is
omitted, returns everything to the end of the string. If LENGTH
is negative, leaves that many characters off the end of the
string.

You can use the substr() function as an lvalue, in which case
EXPR must itself be an lvalue. If you assign something shorter
than LENGTH, the string will shrink, and if you assign something
longer than LENGTH, the string will grow to accommodate it. To
keep the string the same length you may need to pad or chop your
value using "sprintf".

If OFFSET and LENGTH specify a substring that is partly outside
the string, only the part within the string is returned. If the
substring is beyond either end of the string, substr() returns
the undefined value and produces a warning. When used as an
lvalue, specifying a substring that is entirely outside the
string is a fatal error. Here's an example showing the behavior
for boundary cases:

my $name = 'fred';
substr($name, 4) = 'dy'; # $name is now 'freddy'
my $null = substr $name, 6, 2; # returns '' (no warning)
my $oops = substr $name, 7; # returns undef, with warning
substr($name, 7) = 'gap'; # fatal error

An alternative to using substr() as an lvalue is to specify the
replacement string as the 4th argument. This allows you to
replace parts of the EXPR and return what was there before in
one operation, just as you can with splice().
<< |< 1 2 3 4 >| >> 33 Einträge, 4 Seiten



View all threads created 2007-04-07 21:40.