seth: reguläre Ausdrücke

Beitrag lesen

gudn tach!

$searchstring = '/'.
'([[]'.$tagname.')'.
'((?:([:|=])([a-fA-F0-9]*))?)'.
'((?:([:|=])(")?((.|\n$)*?)(")?)?)'.
'(?:[]])'.
'((.|\n)+?)'.
'(?:[[][/]'.$tagname.')'.
'((?:([:|=])([a-fA-F0-9]*))?)'.
'((?:([:|=])(")?((.|\n$)*?)(")?)?)'.
'(?:[]])'.
'/';

kuerzer wird's mit den von mir genannten schreibweisen:
 $searchstring = '/'.
  '(['.$tagname.')'.
  '((?:([:|=])([a-fA-F0-9]*))?)'.
  '((?:([:|=])(")?((.|\n$)*?)(")?)?)'.
  ']'.
  '((.|\n)+?)'.
  '[/'.$tagname.
  '((?:([:|=])([a-fA-F0-9]*))?)'.
  '((?:([:|=])(")?((.|\n$)*?)(")?)?)'.
  ']'.
 '/';

das problem der mehreren tags hintereinander besteht aber immer noch.

Den Array mit den  Ergebnissen füge ich mal an:

dafuer gibt's print_r. ;-)

$pattern_array[9][0]=s
$pattern_array[13][0]=8

Dort kann man sehen, daß die Begrenzung mit ?: nicht überall was bringt, aber das Ergebnis ist schon etwas knapper als ohne.

naja, du musst es halt auch richtig verwenden.
da du abe noch nicht gesagt hast welche infos du alle extrahieren willst, koennen wir dir auch nur schlecht helfen.

wenn du nur den username und den content extrahieren willst, dann ginge das in etwa so:

$searchstring = '/'.
  '['.$tagname.
  '(?:[:|=][a-fA-F0-9]*)?'.
  '(?::|=?(.*?)(?:")?)?'.
  ']'.
  '(.+?)'.
  '[/'.$tagname.
  '(?:[:|=][a-fA-F0-9]*)?'.
  '(?::|=?(.*?)(?:")?)?'.
  ']'.
 '/s';

beachte den s-modifier.

und das liesse sich noch mal kuerzen:

$tag_pattern = $tagname.
  '(?:[:|=][a-fA-F0-9]*)?'.
  '(?::|=?(.*?)(?:")?)?'.
  ']';
 $searchstring = '/'.
  '['.$tag_pattern.
  '(.+?)'.
  '[/'.$tag_pattern.
 '/s';

Weshalb die letzen Zeichen von Unterausdrücken in dem Array noch einmal gesondert auftauchen (8 und s) ist mir etwas fremd - ist das normal?

wenn du sowas machst

/f(.*)r/

und das z.b. auf den string "foobar" loslaesst, dann wird der string gematcht, und es gilt $1 =="ooba".

wenn du aber (wie in deinem fall)

/f(.)*r/

verwendest, dann wird nur der letzte gematchte ausdruck gespeichert, also $1 == "a".

Momentan wird der Tag in der Variablen $tagname übergeben, sicherlich wäre es jetzt noch möglich, diesen auch per regulärem Ausdruck auszulesen, allerdings habe ich das ganze bereits in einer Schleife integriert und müßte recht viel umschreiben.

wahrscheinlich muesstest du das nicht.
du koenntest einfach
   $tagname = (?:tagX|tagY|tagZ)
setzen. der regexp-code bliebe derselbe.

prost
seth