Brauche Hilfe bei regulären Ausdruck

VanHellsehn

Erfahrenes Mitglied
Hi,
Ich habe folgendes Datei Format:
PHP:
<?php
/* Allgemein */
define('TEST',1); // Test
/* Anderes */
define('TEST_2', 2); // Test 2
?>

Und ich möchte dieses via PHP lessen und schreiben.
Also ich möchte diese Datei in eine folgende Array laden:
Code:
array(
0 => array(
    0 => 'Allgemein',
    1 => array(
        0 => array(
            0 => 'TEST',
            1 => 1,
            2 => 'Test'
            )
        )
    )
1 => array(
    0 => 'Anderes',
    1 => array(
        0 => array(
            0 => 'TEST_2',
            1 => 2,
            2 => 'Test 2'
            )
        )
    )
)

Ich habe gerade absolut keine Ahnugn wie ich den Reg.Ausdruck schreiben soll. Ein kleiner ansatz wäre nicht schlecht.
Danke im voraus!

Edit:
Array war nicht Korrekt
 
Zuletzt bearbeitet:
was wilst Du eigentlich genau Vielleicht wäre eine detailierte Beschreibung angebracht.....
Hi,
Also ich möchte eine Config-Datei haben in der ein paar Konstanten definiert sind. Diese möchte ich via PHP aber ändern können. Also habe ich mir gedacht unterteile ich es in Gruppen (jeweils in /* und */ eingefasst) und schreibe hinter jede Konstante einen Namen bzw. Beschreibungen (und zwar mit // ). Und dafür wolte ich es in eine Array laden und Ausgeben also mit Inputs etc..

So jetzt stellt sich nur die frage wie bekomme ich diese Date in eine Array geladen. Ich kann mir ja den Content via file_gets_content(); laden aber dann muss ich dies mit einem Regulärenasudruck durchsuchen. Nur wie bekomme ich die unterteilung mit den Gruppen hin? Also das die Fertige Array in gruppen unterteilt ist.
 
Das ganze wie du es machen willst, ist etwas kompliziert. Aber naja.....
Ich rate dir eher zu PropertyClassen/Reader und Propertyfiles
http://wiki.yaslaw.info/wikka/PhpLibPropertyReader

Aber falls du an deiner Lösung festhalten willst, etwa so könnte das aussehen.
PHP:
<?php
// Das einlesen simulieren
//$rows = file('myFiale.php');
$string = 
"<?php 
/* Allgemein */
define('TEST',1); // Test
/* Anderes */
define('TEST_2', 2); // Test 2
?> ";
$rows = explode("\n", $string);


//Ab hier beginnt der eigentliche Code
$result = array();

//alle Rows trimmen
$rows = array_map('trim', $rows);

foreach ($rows as $row){
    //auf /*...*/ prüfen
    if(preg_match('/^\/\*(.+)\*\/$/', $row, $match)){
        //falls part bereits diesen dem resultat anhängen
        if(is_array($part)) $result[] = $part;
        // Neuer part eröffnen
        $part = array(trim($match[1]));    
    //auf define prüfen
    }elseif(preg_match("/^define\('(.*)',(.*)\);[ ]*\/\/(.*)$/", $row, $match)){
        // Erster Eintrag entfernen, da dies der gefundene String über das ganze Suchmuster ist.
        // Die Indexe werden neu vergeben
        array_shift($match);
        // part um den getrimmten array der 3 Resultate erweitern
        $part[] = array_map('trim', $match);
    }
}
// part dem resultat anhänen
if(is_array($part)) $result[] = $part;    

var_export($result);
?>
 
Das ganze wie du es machen willst, ist etwas kompliziert. Aber naja.....
Ich rate dir eher zu PropertyClassen/Reader und Propertyfiles
http://wiki.yaslaw.info/wikka/PhpLibPropertyReader
Hi,
Ich weiß das es eher Kompliziert ist deswegen frage ist ja nach =)
Danke schonmal für das Script. Du hast mir ja noch einen Link hinterlassen..
Ich könnte das ganze nat. auch via parse_ini_file(); machen nur verbraucht das nicht zuviel Performance wenn ich das bei jedem Seiten aufruf mache?
Den ich wolte eine Methode die wenig Performance verbraucht. Also beim zugreifen auf die Configs. Das obere laden der Daten in eine Array ist ja nur zum anzeigen einer HTML-Form mit der ich die Configs ändern kann.
Was meinst du bzw. ihr was ich ambesten machen kann?

Edit:
Und noch eine Frage. Und zwar wie kann ich es einstellen das er wenn bei define ein String in die Konstante geschrieben wird, also zb. define('URL', 'http://bla.de'); das er die ' am anfang und ende nicht speichert?
 
Zuletzt bearbeitet:
Edit:
Und noch eine Frage. Und zwar wie kann ich es einstellen das er wenn bei define ein String in die Konstante geschrieben wird, also zb. define('URL', 'http://bla.de'); das er die ' am anfang und ende nicht speichert?
Soe wie im ersten Teil des Patterns

Code:
Bisher:
/^define\('(.*)',(.*)\);[ ]*\/\/(.*)$/
Neu:
/^define\('(.*)',[ ]*'(.*)'\);[ ]*\/\/(.*)$/

Änederung:
(.*) durch [ ]*'(.*)' ersetzt. Das [ ]* steht für beliebig viele Leerzeichen vor dem ersten '
 
Hi,
Hab wieder ne frage.. ich bin mir gerade das Script am schreiben was mit die Daten ändert.
Was ist an folgendenm Reg.-Ausdruck verkehrt?

PHP:
<?php
$source = "<?php
/* Allgemein */
define('WEBSITE_TITLE', xyz.de'); // Webseitentitel
define('URL_BASE', 'http://www.xyz.de'); // URL-Base
/* Test */
define('test', true); // Test
?>";

$muster = "/^define\('WEBSITE_TITLE',[ ]*[']?.*[']?\);[ ]*\/\/[ ]*Webseitentitel$/S";
$replace = "define('WEBSITE_TITLE', 'xy.de'); // Webseitentitel\n";
$source = preg_replace($muster, $replace, $source);
?>
Wenn ich die Variable Source am ende mit Echo ausgebe kommt dort immer noch der Altecode bei rum. Also unverändert.

Danke im voraus =)
 
Zuletzt bearbeitet:
Der String, nach dem du suchst, befindet sich innerhalb des zu durchsuchenden Strings, daher solltest du ^ am Anfang und $ am Ende des Ausdrucks entfernen. [ ]* zu verwenden, um nach Leerzeichen zu suchen, ist wohl auch kein Standard. Dafür gibt es die vordefinierte Zeichenklasse \s, siehe http://de.wikipedia.org/wiki/Regulärer_Ausdruck#Vordefinierte_Zeichenklassen .
Hi,
Kannst du mir erklären warum man das ^ und das $ wegmachen soll?
Meiner Meinung nach heißt ^ doch gleich = Zeilenanfang und $ = Zeilenende und das ist doch alles in einer Zeile..
ja klar ich kann auch POSIX benutzten [[:space:]] aber geht auch so ^^
 
Zurück