Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
[REGEX] Regex mit 2 Variablen - Parser wird gierig [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
[REGEX] Regex mit 2 Variablen - Parser wird gierig


 
daniel987
15-09-2005, 17:03 
 
Ich möchte folgendes ersetzten (außenrum steht natürlich noch anderer Text):

{$var|modifier}

Allerdings bekomme ich das pattern dafür einfach nicht hin. Mein bisheriger Versuch ist:

#{\$(.+?)\|(.+?)}#Uis

Allerdings wird dann der Parser immer "gierig" und nimmt einen viel zu großen Text zum erstzen.

 
ghostgambler
15-09-2005, 18:56 
 
#{\$(.+)\|(.+)}#Uis

 
daniel987
15-09-2005, 21:06 
 
Danke für deine antwort, funktioniert so aber leider immer noch nicht der Parser weitet die Klammer weiterhein bis aufs maximum aus.

 
ghostgambler
16-09-2005, 00:20 
 
Original geschrieben von daniel987
Danke für deine antwort, funktioniert so aber leider immer noch nicht der Parser weitet die Klammer weiterhein bis aufs maximum aus.
:confused:
Ich finde er funktioniert Oo
http://pcre.nophia.de/evaluate/65a25d930cd745a556219609825d6f7e/index.php#output

 
daniel987
16-09-2005, 07:45 
 
Naja der Ausdruck scheint aber nicht immer zu funktionieren, ich füge mal ein Stück von meinem Originalcode ein dann siehst du was ich meine.

http://pcre.nophia.de/evaluate/5be185785e23a7671eafa673bc06d1de/index.php#output

 
TobiaZ
16-09-2005, 09:55 
 
Dir ist doch eigentlich klar, wo das Problem liegt, oder?

Der Parser sucht sich die erste klammer und schnappt sich alles bis zur ersten schließenden klammer, die nach einer Pipe kommt. Das hat mit gierig nichts zu tun.

Wenn der erste "Parameter" in deinem Platzhalter keine Leerzeichen enthalten kann/darf, was ich denke, dann reicht es, wenn du im Pattern an der entsprechenden Stelle die Leerzeichen ausschließt.

Noch besser ist natürlich, wenn du den ersten parameter ausschlißlich auf Variablen abstimmst. Vorrausgesetzt das lässt sich mit deinem Vorhaben vereinbaren.

 
Titus
16-09-2005, 10:15 
 
PCRE regex syntax (http://www.php.net/manual/de/reference.pcre.pattern.syntax.php)
...
If the PCRE_UNGREEDY option is set (an option which is not available in Perl) then the quantifiers are not greedy by default, but individual ones can be made greedy by following them with a question mark. In other words, it inverts the default behaviour.
...

Ergo: Nimm das U weg und beide Teilausdrücke werden ungierig.

Alternativ: Ersetze ".+?" durch ".*"
Noch alternativer: #\{\$?(.*)\}#Uis

 
daniel987
16-09-2005, 21:45 
 
Hm also ich hab jetzt mal beide Beispiele ausprobiert, allerdings klappt es damit immer noch nicht, das erst Liefert genau dasselbe Ergebniss wie bisher und das zweite Liefert nur die { } ohne | in der Mitte.

@TobiaZ ja mir war schon klar wo das Problem liegt allerdings hab ich nirgends was dazu gefunden wie man Leerzeichen verbieten kann, ich hab jetzt auch mal den s Modifier entfernt somite beschränkt sich der gefunden Berreich nur noch auf die erste Zeile.

 
Titus
17-09-2005, 11:57 
 
ah oh ... fehlgelesen ... die Pipe-Symbol (Sonderzeichen!!!) muss escaped werden.

also "noch alternativer" streichen!

Nebenbei: Die Modifier i und s kannst du dir schenken:
- i weil "\w" bzw. "." sowieso schon case-insensitiv sind.
- s weil der gesuchte Text wohl kaum einen Zeilenumbruch beinhaltet.


"$var" ist wohl immer da
nur: ist "|modifier" auch immer vorhanden?

wenn ja: #\{\$(\w+)\|(\w+)\}#U => $1='var', $2='modifier'
wenn nicht: #\{\$(\w+)\(|(\w+))?\}#U => $1='var', $3='modifier' (oder nicht vorhanden)


Wichtig: Das Fragezeichen wenn überhaupt dann _hinter_ die Klammern und nicht ans Ende dazwischen! (sonst passiert --> siehe quote oben)

 
daniel987
17-09-2005, 15:17 
 
Danke :) der erste funktioniert, zwar ist der 2 Parameter nicht immer vorhanden, aber dann soll auch gar nichts gefunden werden. Somit ist die erste Lösung perfekt.


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:01 Uhr.