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?
Annonceindlæg fra Novataris
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); ?>
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 ******************************
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=?
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.
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
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>
21. september 2008 - 17:18
#7
Sorry, jeg læste vist spm'et forkert =)
21. september 2008 - 17:27
#8
$contents = preg_replace("/(-- Includes start --)(?:[\w\W]*?)(-- Includes slut --)/", "$1".$erstat."$2", $contents);
21. september 2008 - 17:32
#9
- og med en s-modifier kan du bruge flg. pattern: "/(-- Includes start --)(?:.*?)(-- Includes slut --)/s"
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"
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?
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>
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
21. september 2008 - 22:33
#14
- ellers kan du bruge: $s = preg_replace("/(.*?)-- Includes start --.*?-- Includes slut --(.*?)/s", "$1".$subst."$2", $s);
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 :(?
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
22. september 2008 - 00:04
#17
Jeg kan ikke gekende dine problemer =)
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:>
Vi tilbyder markedets bedste kurser inden for webudvikling