Avatar billede jansangill Nybegynder
21. september 2008 - 13:17 Der er 18 kommentarer

Hjælp til replace

*******************************

Dette skal ikke væk

-- Includes start --
1.php
2.php
3.php
4.php
-- Includes slut --

Dette skal ikke væk

******************************

Detd er skal ske er at alt inden i disse includes skal replaces med en ny værdi, men alt uden for skal ikke røres.

Hvordan ville man gribe det an?
Avatar billede wanze Nybegynder
21. september 2008 - 15:09 #1
Jeg ville nok løse det med en regular expression replace:

<?php

$text = "*******************************

Dette skal ikke væk

-- Includes start --
1.php
2.php
3.php
4.php
-- Includes slut --

Dette skal ikke væk

******************************";

$erstatning = "Heste er flotte
4.php
6.php
1.php";

print preg_replace("/(-- Includes start --\n)([^--]+)/","$1$erstatning\n",$text);

?>
Avatar billede wanze Nybegynder
21. september 2008 - 15:10 #2
Ovenstående vil forresten returnere:

X-Powered-By: PHP/5.2.0
Content-type: text/html

*******************************

Dette skal ikke væk

-- Includes start --
Heste er flotte
4.php
6.php
1.php
-- Includes slut --

Dette skal ikke væk

******************************
Avatar billede jansangill Nybegynder
21. september 2008 - 16:17 #3
Hej wanze, tak for svar.

med dit forslag, som jeg har prøvet at sætte i action med dette kode:

***********************************************************
function get_files($place){

    $files = array();
    $path = $place;
    $handle = @opendir($path) or die("Unable to open folder");
   
    while (false !== ($file = readdir($handle))) {
          if (substr($file,-4) == ".php")  {
            $files[] = $file;
        }
     
    }
    closedir($handle);
    return $files;

}

$files_to_get = get_files('../../../web/templates/side_templates/');
sort($files_to_get);

foreach ($files_to_get as $file_get) {
    $files_to_write = $files_to_write . $file_get . "\n";
}

$filename = "../../../test.php";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);

$contents = preg_replace("/(-- Includes start --\n)([^--]+)/","$1$files_to_write\n",$contents);

$file2open = "../../../test.php";
$listfile = fopen($file2open, 'w');
fwrite($listfile,$contents);
fclose($listfile);

**************************************************************


Det her er hvad der står i test.php:

gdfgdf

-- Includes start --
1.php
2.php
3.php
4.php
-- Includes slut --

gdfgdfgdf


Dette er output når jeg har repalcet det:

gdfgdf

.php
2.php
3.php
4.php

-- Includes slut --

gdfgdfgdf



Som du kan se så går det ikke helt korrekt til, jeg mangler at -- includes start -- bliver skrevet med, og jeg mangler mærkelig nok at den også skriver 1.php med, som den første.

Kan du se fejlen=?
Avatar billede wanze Nybegynder
21. september 2008 - 17:06 #4
Start med at lav noget debugging. Udskriv indholdet løbende. Start med at udsrkive $contents, før du laver en replace.
Avatar billede wanze Nybegynder
21. september 2008 - 17:13 #5
Udskriv evt. også $files_to_write og se om den indeholder det du tror. Det kan også være at
  $contents = preg_replace("/(-- Includes start --\n)([^--]+)/","$1$files_to_write\n",$contents);
giver problemer. Undersøg, hvad:
  $contents = preg_replace("/(-- Includes start --\n)([^--]+)/","$1 flaftest\n",$contents);
Returnerer
Avatar billede olebole Juniormester
21. september 2008 - 17:17 #6
<ole>

wanze >> Det er ikke jansagills kode, den er gal med ... det er din RegExp  ;o)

$contents = preg_replace("/(Includes slut --)[\w\W]*$/", "$1", $contents);

/mvh
</bole>
Avatar billede olebole Juniormester
21. september 2008 - 17:18 #7
Sorry, jeg læste vist spm'et forkert  =)
Avatar billede olebole Juniormester
21. september 2008 - 17:27 #8
$contents = preg_replace("/(-- Includes start --)(?:[\w\W]*?)(-- Includes slut --)/", "$1".$erstat."$2", $contents);
Avatar billede olebole Juniormester
21. september 2008 - 17:32 #9
- og med en s-modifier kan du bruge flg. pattern:
    "/(-- Includes start --)(?:.*?)(-- Includes slut --)/s"
Avatar billede olebole Juniormester
21. september 2008 - 17:37 #10
- og hvis dine linjeskift efter '-- Includes start --' og før '-- Includes slut --' er vigtige kan du bruge:

"/(-- Includes start --(?:\r|\n)*)(?:.*?)((?:\r|\n)*-- Includes slut --)/s"
Avatar billede jansangill Nybegynder
21. september 2008 - 22:14 #11
Hej ole, har prøvet dine forsøg, men synes ikke rigtigt at det funker.

Har prøvet med f.ekst denne her:

$contents = preg_replace("/(-- Includes start --)(?:[\w\W]*?)(-- Includes slut --)/", "$1".$files_to_write."$2", $contents);

Problemet er i øjeblikket at den synes at skrive nøjagtigt det samme som der står i filen.

Meningen er at files_to_write (som bliver skrevet ud korrekt) skal ind imellem --start-- og --slut--

Desværre sker det ikke i øjeblikket. Det der sker er at $contents indeholder nøjagigt det samme som filen. Der bliver altså ikke erstattet noget.

Hvad kan forklaringen være?
Avatar billede olebole Juniormester
21. september 2008 - 22:27 #12
Det her funker fint her:

<pre>
<?php
$s = <<<STREND
Dette skal ikke væk

-- Includes start --
1.php
2.php
3.php
4.php
-- Includes slut --

Dette skal ikke væk
STREND;

$subst = <<<STREND
En eller anden tekst,
som skal erstatte den,
vi lige har fjernet.
STREND;

print "\r\n".$s."\r\n";
print $subst."\r\n---------------------------------\r\n";

$s = preg_replace("/(-- Includes start --(?:\r|\n)*)(?:.*?)((?:\r|\n)*-- Includes slut --)/s", "$1".$subst."$2", $s);
print $s;
?>
</pre>
Avatar billede olebole Juniormester
21. september 2008 - 22:29 #13
Ovenstående resulterer i:

Dette skal ikke væk

-- Includes start --
En eller anden tekst,
som skal erstatte den,
vi lige har fjernet.
-- Includes slut --

Dette skal ikke væk

- men jeg ved ikke, om du også vil fjerne start- og slutlinjerne
Avatar billede olebole Juniormester
21. september 2008 - 22:33 #14
- ellers kan du bruge:
    $s = preg_replace("/(.*?)-- Includes start --.*?-- Includes slut --(.*?)/s", "$1".$subst."$2", $s);
Avatar billede jansangill Nybegynder
21. september 2008 - 23:36 #15
ja, kan godt se at med din eksempel virker det fint. Men så må jeg jo dumme mig et eller andet sted, fordi når jeg prøver at skrive det ud med mit, sår sker der ikke noget.


Sådan ser filen ud, test.php:

Dette skal ikke væk

-- Includes start --
1.php
2.php
-- Includes slut --

Dette skal ikke væk


sådan er koden:

foreach ($files_to_get as $file_get) {
    $files_to_write = $files_to_write . $file_get . "<br>";
}

$filename = "../../../test.php";
$handle = fopen($filename, "r");
$contents = fread($handle, filesize($filename));
fclose($handle);

$contents = preg_replace("/(-- Includes start --(?:\r|\n)*)(?:.*?)((?:\r|\n)*-- Includes slut --)/s", "$1".$files_to_write."$2", $contents);


files_to_write bliver skrevet ud således:
1.php
2.php
3.php
4.php

$contents bliver skrevet ud således FØR preg_replace:

Dette skal ikke væk

-- Includes start --
1.php
2.php
-- Includes slut --

Dette skal ikke væk

$contents  bliver skrevet ud således EFTER preg_replace:

Dette skal ikke væk

-- Includes start --
1.php
2.php
-- Includes slut --

Dette skal ikke væk



Som du kan se så fejler det ved mine forsøg, men ikke ved dine. Kan du spotte fejlen i mit :(?
Avatar billede jansangill Nybegynder
21. september 2008 - 23:50 #16
Ser ud til forrige post var for hurtigt:

Det der sker nu, er at ved dette:

$contents = preg_replace("/(-- Includes start --(?:\r|\n)*)(?:.*?)((?:\r|\n)*-- Includes slut --)/s", "$1".$files_to_write."$2", $contents);
print $contents;

sker dette:

Dette skal ikke væk .php
2.php
3.php
4.php
-- Includes slut -- Dette skal ikke væk

Som du kan se mangler jeg at have med:
-- Includes start --
og det første tegn i den første fil, altså 1.php synes at blive forkortet til .php
Avatar billede olebole Juniormester
22. september 2008 - 00:04 #17
Jeg kan ikke gekende dine problemer  =)
Avatar billede jansangill Nybegynder
22. september 2008 - 07:07 #18
Det er helt okay, jeg må nørkle med det selv.

Mange tak for hjælpen. Smid du et svar:>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester