Regulärer Ausdruck und preg_match

kamp

Grünschnabel
Hallo!

Ich habe ein Verzeichnis, in dem Dateien mit folgendem Beispielinhalt liegen:

PHP:
<?php
$titel="Titel";
$beschreibung="Beispiel";
$keywords="key1,key2,key3";
?>

Nun versuch ich mich an einer Suchfunktion, mit preg_match() die derweilen so aussieht:

PHP:
		// Titel ermitteln
		preg_match("=$titel\=\"(.*)\";=siU", $str, $title);

		// Beschreibung ermitteln
		preg_match("=$beschreibung\=\"(.*)\";=siU", $str, $descr);

		// Keywords
		preg_match("=$keywords\=\"(.*)\";=siU", $str, $keyw);

Wenn ich jetzt die suche starte, wird offensichtlich nur im Titel durchsucht. Nicht aber in Beschreibung oder in den Keywords. was ist da mein Fehler?

wenn ich mir $title[1].$descr[1].$keyw[1] augeben lasse sieht das in dem Beispiel so aus:

TitelTitelTitel
 
Zuletzt bearbeitet:
Das $ am Anfang des Pattern bedeutet Textanfang. Wenn du das $ als Zeichen verwenden willst, dann musst du es escapen.
\$

PHP:
       preg_match("=\$titel\=\"(.*)\";=siU", $str, $title);
 
Stimmt, da hast nu natürlich recht. Hab das $ nun in jeder Zeile escaped, aber wenn ich nun $title[1].$descr[1].$keyw[1] ausgeben lassen, habe ich gar keinen Wert mehr?

und wenn ich mir die kompletten arrays ausgeben lasse siehts so aus:
Array ( [0] => [1] => ) Array ( [0] => [1] => ) Array ( [0] => [1] => ) Array ( [0] => [1] => ) Array ( [0] => [1] => ) Array ( [0] => [1] => ) Array ( [0] => [1] => ) Array ( [0] => [1] => ) Array ( [0] => [1] => )

weil ich direkt nach den preg_match folgenden code habe:
Code:
		if(!isset($title[1])) {
			$title = array('','');
		}
		if(!isset($descr[1])) {
			$descr = array('','');
		}
		if(!isset($keyw[1])) {
			$keyw = array('','');
		}
 
Zuletzt bearbeitet:
Es war doppelt falsch!
Du umgibst dein Pattern mit doppeltem Anführungszeichen. Darin hast du $titel. Dies wertet PHP als Variable mit dem Namen $titel.
PHP:
$pattern = "=$titel\=\"(.*)\";=siU";
var_dump($pattern);
// ergibt '=\="(.*)";=siU'
// da $titel durch den Inhalt der nicht initialisierten Variable $titel ersetzt wird
Nun haben wir ein \ davor gesetzt
PHP interpretiert '\$titel' nicht mehr als Variable, sondern als String '$titel'
PHP:
$pattern = "=\$titel\=\"(.*)\";=siU";
var_dump($pattern);
//ergibt 0=$titel\="(.*)";=siU0'
Jetzt haben wir zwar $titel im pattern, jedoch wird das $ am Anfang des Patterns vom RegExp für Anfang der Textes intepretiert
PHP:
//entweder
$pattern = "=\\\$titel\=\"(.*)\";=siU";
//oder (ist eher mein Favorit)
$pattern = '=\$titel\="(.*)";=siU';

Mein Tipp. Patterns immer in einfachen Anführungszeichen schreiben, damit diese nicht durch PHP geparst werden. Ausser natürlich, man stellt das Pattern dynamisch zusammen.
 
Was genau hast du eigentlich vor? Wenn das eine PHP Datei ist, kannst du die richtige doch einfach einbinden und die Werte auslesen. Oder nimm sonst einfach eine INI Datei.
 
Zurück