regular expression

Alles, was PHP betrifft, kann hier besprochen werden.

regular expression

Postby insane.eye » 10. March 2005 16:05

Hi, hab da en kleines problem ;)

Code: Select all
$str = "[size=2]texteins[size=3]textzwei[/size]textdrei[/size]";

preg_match_all("!(\[size=3\])([^\\s]{5,})?(\[/size\]|\[size=[1-6]\]|\[url\])!",$str,$res);

print_r($res);


ich möchte das er mir den string 'textzwei' (mindestens 5 zeichenlang) ausgibt, also bis zum ersten übereinstimmenden string wie [/size] oder [size=2] oder auch [url], aber leider beachtet er das '?' nicht und läuft bis zum letzten string (in eckigen klammern) durch, kann mir da jemand helfen ??

danke :)
insane.eye
 
Posts: 8
Joined: 16. January 2005 01:19

Postby jakimo72 » 28. March 2005 22:55

Reguläre Ausdrücke suchen immer
den längstmöglichen String.
ein Workarround wäre:
Code: Select all
$str = "[size=2]texteins[size=3]textzwei[/size]textdrei[/size]";
preg_match_all("!(\[size=3\])([^\[]{5,})?(\[/size\]|\[size=[1-6]\]|\[url\])!",$str,$res);
print_r($res);

Dann darf in Deinem String textzwei die eckige Klammer
nicht enthalten sein.

Oder gibt es irgendwelche Regulären Ausdrücke, die
immer den kürzestmöglichen String zurückliefern?
User avatar
jakimo72
 
Posts: 151
Joined: 07. February 2005 13:25
Location: Hamburg-Barmbek

Postby Straffi » 29. March 2005 00:27

Moin jakimo72,

lang und kurz ist bei regulären Ausdrücken immer relativ.
Es gibt tatsächlich Reguläre Ausdrücke, die auf den kleinsten Teil passen, die 'nicht-gierigen' Treffer.
Ein 'gieriger' (greedy) Ausdruck versucht immer auf den größtmöglichen Teil zu passen, ein 'nicht gieriger' (non-greedy) auf den kleinsten.

'Nicht-gierige' treffer sind IMHO nur mit PCRE möglich, die in dem Beispiel ja auch verwendet werden.

Kurzes (geklautes) Beispiel:
Code: Select all
  // gieriges Verhalten
  preg_match_all('/p.*/', 'php', $res);
  print_r($res);
 
  // nicht gierig wegen ?
  preg_match_all('/p.*?/', 'php', $res);
  print_r($res);

  // nicht gierig wegen U
  preg_match_all('/p.*/U', 'php', $res);
  print_r($res);


Wenn ich das Problem richtig verstanden habe, sollte ein U am Ende des Ausdruckes ('!U') auf nicht gieriges matching umschalten, und immer den küzestmöglichen Ausdruck liefern.


mfg straffi
User avatar
Straffi
 
Posts: 120
Joined: 07. October 2003 17:48

Postby $Ben » 29. March 2005 02:15

Zwei meiner generellen Bookmarks zu diesem Thema:
:arrow: http://www.amk.ca/python/howto/regex/
:arrow: http://www.regular-expressions.info/
$Ben
 
Posts: 25
Joined: 26. March 2005 22:24
Location: Remagen


Return to PHP

Who is online

Users browsing this forum: No registered users and 54 guests