PHP preg_match_all - zwei Submuster

Deblu

Cadet 3rd Year
Registriert
Nov. 2005
Beiträge
60
Hallo, ich wollte mal fragen, ob es mit der Funktion preg_match_all möglich ist, zwei Submuster in Arrays zu speichern.
Ist für so eine Art "Programmiersprache", die PHP auswertet und das, was gemacht werden soll, ausgibt. Dafür möchte ich mit der Funktion preg_match all Variablen auslesen.
Beispiel in meiner Erdachten Sprache:

body="Hallo";

So, jetzt habe ich eine Funktion in PHP:


PHP:
function dss_create_array($string) 
{ 
  $pattern = '/(.*?)="(.*?)";/si'; 
  preg_match_all($pattern, $string, $item); 
  return $item[1]; 
}

Wenn der String body="Hallo"; ist, dann bekomme ich ein Array durch die Funktion geliefert, der einen Wert enthält und zwar body.
Ich habe ja aber zwei Submuster im Muster ($pattern) angegeben, zwei mal (.*?) . Nun erhalte ich aber in $item[1] nur das Array vom ersten Subdingens von allem, das auf das Muster passt. Wie lese ich aber jetzt im Beispiel body und Hallo aus?
 
Ganz einfach mit $item[2];


preg_match_all liefert folgendes Muster:

0 => gesamter Ausdruck
1 => 1. Submuster
2 => 2. Submuster
...
x. => x. Submuster



Ciao
 
Lass dir doch die ganze variable dumpen:
PHP:
function dss_create_array($string) 
{ 
  $pattern = '/(.*?)="(.*?)";/si'; 
  preg_match_all($pattern, $string, $item); 
  echo '<pre>';var_export($item);exit;
}

Edit - also das fertige würd dann ungefähr so aussehn:
PHP:
function dss_create_array($string) 
{ 
  $return = array();
  $pattern = '/(.*?)="(.*?)";/si'; 
  if(preg_match_all($pattern, $string, $item)) {
    foreach($item as $zeilen) {
      $return[$zeilen[1]] = $zeilen[2];
  }
  return $return;
}
 
Zuletzt bearbeitet:
Hi, danke für eure Hilfe. Ich habe jetzt folgendes Problem:
Wenn ich als String zum Beispiel übergebe:

body="Welcome";headline="Willkommen auf Sabinasz.net!";

also ohne zeilenumbruch, dann bekomme ich mit
PHP:
      		$content = dss_create_array($page->getContent());
      		echo '<h2>' . $content['headline'] . '</h2>';
      		echo $content['body'];
beides angezeigt.
Wenn ich aber einen Zeilenumbruch einfüge:

body="Welcome";
headline="Willkommen auf Sabinasz.net!";

dann kann nur das jeweils erste, in dem Fall body, ausgelesen und angezeigt werden.
Die Funktion sieht so aus:
PHP:
function dss_create_array($string)
{
  $pattern = '/(.*?)="(.*?)";.*/si';
  preg_match_all($pattern, $string, $array);
  $return = array();
  for ($i = 0; $i < count($array[1]); $i++) {
    $return[$array[1][$i]] = $array[2][$i];
  }
  return $return;
}

Bei Pattern habe ich nach dem Semikolon schon .* gesetzt und das s bewirkt, dass der Jokerpunkt . für alle Zeichen einschließlich eines Zeilenumbruchs steht, das * soll bewirken, dass dies kein, einmal oder beliebig oft eintrifft.
Leider funktioniert das trotzdem nicht. woran kann das liegen?
 
Achso, habs schon. Er weiß ja nicht, ob der Zeilenumbruch schon zum Namen der Variable gehört. Ich hab das so gelöst:

set body="Welcome";
set headline="Willkommen auf ...";

und das Suchmuster sieht so aus:
/set (.*?)="(.*?)";[.]*/si
 
Zurück
Oben