webForumDet fria alternativet

search and replace med preg_replace

13 svar · 508 visningar · startad av Chavez

ChavezMedlem sedan maj 20001 953 inlägg
#1

Hejsan!

En lite uppgift för alla regexp gurus. Har en sträng och göra lite search and replace på.
Det hela handlar om att man har en textmassa som innehåller en array, denna arrayen skall jämföras med en ny array. Nycklarna i de båda arrayerna är alltid samma. Men värdena på elementen kan skilja sig. Det är det som skall regexpas så att den nya gäller.

Stängen $body innehåller en configfil som en lång sträng.
Varje rad ser ut på följande sätt:
$CMSconfig["variabel"] = "ett värde";
eller:
$CMSconfig["variabel"] = true; (och givetvis också false i vissa fall).

$body läses in via en fopen.

Replacen skall vara när man i en webbadmin vill ändra på ett värde i konfig-filen. Jag skickar in en ny array som skall jämföras. Men det behöver inte ni bry er om.
Jag vill ersätta själva värdet ("ett värde" eller true) med ett värde som kommer in från en ny array (en array som kommer ifrån ett skickat formulär). Hmm .. har lite kod. Om den gör er klokare:

class configfiles
{

    ....
    en den andra funktioner i klassen
    ....

    function search_replace( $handle, $oldarray, $newarray, $body ) 
    {  
        // Handle är CMS, som jag skrev innan..., klassen skall inte bara hantera arrayen $CMSconfig utan också t ex $NEWSconfig ..
        // $oldarray är en gamla arrayen i "PHP-form"
        // $newarray är den nya arrayen i "PHP-form"
        // $body är den gamla arrayen i strängform .. här skall själva replacen ordnas ...

        foreach ($oldarray as $variable => $value) {

            if ($value != $newarray[$variable]) {
                // Det är en skillnad mellan den gamla och den nya arrayen, ändra detta i $body

                // Här skall det allstå ske en ersättning 
                // Det gamla värdet som är $value skall ersättas med det nya som är $newarray[$variable]

                // Lite jobbigt är också att det kan ju ligga med ", dessa behöver ju dock inte vara med.
               // Antar att här behövs en liten preg_replace .. för en str_replace har väl lite problem med och kolla upp " eller inte?
            }
        }
    }
}

Uj uj .. detta var svårt och förklara. Två exempel...

1.
$CMSconfig["defaultlanguage"] = "svenska";
skall ersättas med
$CMSconfig["defaultlanguage"] = "dutch";

2.
$CMSconfig["configmode"] = true;
skall ersättas med
$CMSconfig["configmode"] = false;

Jag vet inte heller om jag bara kronglar till det för mig. Men jag ville testa ett lite annorlunda och förhoppningsvis effektivt och flexibelt sätt och hantera config-filer.

Tack på förhand!

SPiNMedlem sedan mars 20007 896 inlägg
#2

Jag vet inte om jag har förstått dig rätt, men om jag har gjort det kanske en sån enkel sak som följande fungerar:

for ( $i = 0; $i < count ( $oldarray ); $i++ ) {
     $oldarray[ $i ] = $newarray[ $i ];
}

Alla värden ersätts i den gamla arrayen, men om den nya var identisk från början - och sen editerad så bör det ju fungera. De gamla värdena är samma, men de nya uppdateras. :)

ChavezMedlem sedan maj 20001 953 inlägg
#3

Nja, det är i en textsträng som jag vill ersätta. Så jag tror inte att det funkar. Visst kunde man göra så, för att sedan stega arrayen och skriva den till en fil igen. Men då blir strukturen helt låst på configfilen, jag vill att man skall kunna pilla lite för hand också.

Eller så är det jag som är helt fel ute, känner mig lite förvirrad :)

ThACRoWMedlem sedan dec. 2001314 inlägg
#4

Om man ska ändra inställningar så hade ju jag föredragit att ha dem i en databas. Det går ju bra med de allra flesta inställningar förutom sådana som inloggninsinfo till databasen, men det gör ju inte så mycket ifall man bara kan ändra det lokalt... eller?

SPiNMedlem sedan mars 20007 896 inlägg
#5

Tja, textsträngar och arrayer för att hantera konfiguration känns inte helt riktigt. Bygg upp dokument ( Antingen i filform, eller direkt i PHP ) med XML som du enkelt kan manipulera. Easy. :)

ChavezMedlem sedan maj 20001 953 inlägg
#6

Databas: Jo, kanske. Men det blir ett sådant hammrande på databasen hela tiden. Enligt mig vore det smartare och spri ut belastningen lite. Ha information i databasen och konfiguration i filer.

SPiN: Den tanken har slagit mig också. Men jag vet inte, gjorde såhär för och slippa ha ett allt för "standardiserat" format på konfigfilerna.
Såhär fungerar det:

När man surfar på de "vanliga sidorna" så tas de precis som med vilken konfig som helst. En include på den och så får man arrayen $CMSconfig. Där är det inga textsträngar inblandade.

Det är i administrationen, då läser jag in konfigfilen med fopen()-file()-implode(). Sen sker search and replace vid submit, men bara om det behövs. Vid submit skrivs också den nya konfigen, denna konstrueras alltså inte på nytt utan det är den gamla, som str_replace gjort lite jobb på. Den nya konfigen skrive inte heller om inget har ändrats vid submitten.

Just vid administrationen så skulle jag gott kunna tänka mig att det slöar lite. Men den använder man ju sig så lite av ändå. Vid körning av den vanliga sidan skall det inte slöa!

Fortsätter gärna disskutera. Skall också posta klassen i tråden när den är klar! Om ni nu inte får mig på andra tankar innan dess :)

Ps: Glömde kommentara XML: det låter ju trevligt, i teorin. Men i praktiken blir det väl så att man får nysta upp XML filen @ runtime, varje gång? Om man sparar det som en array i en .php fil så har man ju den klar. Eller missuppfattade jag dig?

SPiNMedlem sedan mars 20007 896 inlägg
#7

Ps: Glömde kommentara XML: det låter ju trevligt, i teorin. Men i praktiken blir det väl så att man får nysta upp XML filen @ runtime, varje gång? Om man sparar det som en array i en .php fil så har man ju den klar. Eller missuppfattade jag dig?

Njä, det bästa är väl att ha dokumentet som en instans av någon parser-klass för enkel användning, ingen array. Att nysta upp det vid runtime är väl inget problem? Du får ju ändå göra samma sak om du använder file () - implode (). Du kan med enkelhet plocka ut de olika värdena på nycklar mha XML, jag tror att det skulle underlätta för dig.

ChavezMedlem sedan maj 20001 953 inlägg
#8

Hmm ..

Antingen så förklarar jag dåligt, eller så hör du lite illa ;)

På sättet som jag gör behöver jag inte nysta upp det varje gång. file() - implode() använder jag bara när jag i webbadministrationen som administratör för sidan skall ändra på en inställning i konfig filen.
När man kör sidan includas bara en .php fil med en array i.

På det sätter behöver jag inte parsa allt varje gång. Vilket måste vara lite effektivare?

SPiNMedlem sedan mars 20007 896 inlägg
#9

Hur lagrar du då dina värden? I includefilen - som du sedan öppnar och editerar via PHP? Kör du eval () på strängen med konfigurationen då? Kanske jag börjar att förstå... ;)

Kanske något sånt här ( Självklart med modifikation ) kan fungera?

preg_replace ( "/\$CMSconfig\[\"variabel\"\] = (.*?[^;]);\n/", "\$CMSconfig[\"variabel\"] = " . $nyttvarde . ";\n", $body );

Fortfarande lite osäker på hur du verkligen menar. :)

ChavezMedlem sedan maj 20001 953 inlägg
#10

Nu börjar vi närma oss här :)
Du har i 90 % rätt nu. Har en includefil som jag editerar via PHP. Dock ingen eval(), fast det skulle man också kunna använda. Arrayen finns dock redan i körningen när denna klassen includas. Så jag kan lika gärna plocka den direkt istället för en eval().

Använde mig nu av en if och två str_replace() istället för en preg_replace(). Borde väl bli snabbare, eller?

SPiNMedlem sedan mars 20007 896 inlägg
#11

Njäe, det vet jag inte. str_replace () är snabbare än preg_replace (), frågan är väl om skillnaden verkligen är så avsevärt stor om man använder två str_replace ()... Funkar det, så skulle jag nog använda det istället för att slösa min tid. ;) :e

Enkelhet är välkommet, speciellt i ditt projekt skulle jag tippa på. Självklart blir det snyggare med en preg_replace (), men är det det du är ute efter? :)

ChavezMedlem sedan maj 20001 953 inlägg
#12

Jag skall pilla med din regexp, kontrollera med min "tidtagning" och sedan bestämma mig :)
Det är inte två som körs varje gång .. antingen den ena eller den andra. Beroende på om det är en = bool_värde eller = "sträng värde".

Men visst, det är lite snyggare :)

ThACRoWMedlem sedan dec. 2001314 inlägg
#13

Du kan ladda hem en trial version på "UBB.threads", det är PHP versionen av Ultimate Bulletin Board. De använder sig av metoden som du vill använda för att editera config-filer.

1: Ladda hem http://www.infopop.com/trial_versions/UBBthreads-trial.zip
2: Studera "config.inc.php", "admin/editconfig.php" och "admin/doeditconfig.php"

ChavezMedlem sedan maj 20001 953 inlägg
#14

Tack för det svaret, jag var alltså inte först med min lysande ide :)

135 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)