WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Få ut vad som står mellan (https://www.wn.se/forum/showthread.php?t=28767)

KarlRoos 2008-04-19 16:35

Hej,
jag har problem med följande rad:
Kod:

$page['content'] = preg_replace('%<module>(.*?)</module>%', include('./Modules/' . $1 . '/index.php'), $page['content']);
Det den ska göra är att hitta exempel. <module>login</module> och inkluderade denna i sidan på exakt samma plats som <module>login</module> stod...
Jag lyckas dock inte få ut vad som står mellan <module> och </module> till en sträng.

Följande funkar 'nästan', den skriver ut "Modul: login"
Kod:

[CODE]$page['content'] = preg_replace('%<module>(.*?)</module>%', 'Modul: $1', $page['content']);
Någon som kan hjälpa mig? :)
Tack på förhand!

MMC 2008-04-19 21:14

Jag tror inte include() gör det du tror att den gör. Ditt regex funkar bevisligen, eftersom det byter ut module-taggarna mot Modul: "det som står mellan taggarna".

include() inkluderar och evaluerar sitt argument när den anropas. Det betyder alltså att all kod i din inkluderade fil körs när du inkluderar den. Som jag förstår ditt inlägg vill du att den matchade strängen ska bytas ut mot innehållet i filen. Då är include() fel val. Får jag föreslå nedanstående lösning på ditt problem?
Kod:

$page['content'] = preg_replace('%<module>(.*?)</module>%', file_get_contents('./Modules/' . $1 . '/index.php'), $page['content']);
Självklart bör du lägga till riktig felkontroll i koden, men det tror jag att du vet.

KarlRoos 2008-04-19 21:17

Citat:

Originally posted by MMC@Apr 19 2008, 21:14
Jag tror inte include() gör det du tror att den gör.
Jo, jag kan använda variablar m.m. som finns på sidan som inkluderar modulen :)

Prolemet ligger inte i includen utan att jag inte kan få ut vad som står mellan <module>*</module> till en sträng.
$1 går inte att använda utanför preg_replace.

MMC 2008-04-19 21:20

Citat:

Ursprungligen postat av KarlRoos
Citat:

Ursprungligen postat av MMC
Jag tror inte include() gör det du tror att den gör.

Jo, jag kan använda variablar m.m. som finns på sidan som inkluderar modulen
Prolemet ligger inte i includen utan att jag inte kan få ut vad som står mellan module*/module till en sträng.
1 går inte att använda utanför preg_replace.

Då föreslår jag en titt på preg_replace syster preg_match http://se2.php.net/manual/en/function.preg-match.php
Speciellt argumentet $matches

WizKid 2008-04-19 21:23

Är det en XML-fil du försöker parsa? Varför inte använda en XML-parser isåfall? Som till exempel simplexml

KarlRoos 2008-04-19 22:34

Citat:

Ursprungligen postat av MMC
Citat:

Originally posted by -KarlRoos@Apr 19 2008, 21:17
Citat:

Originally posted by -MMC@Apr 19 2008, 21:14
Jag tror inte include() gör det du tror att den gör.


Jo, jag kan använda variablar m.m. som finns på sidan som inkluderar modulen
Prolemet ligger inte i includen utan att jag inte kan få ut vad som står mellan module*/module till en sträng.
1 går inte att använda utanför preg_replace.


Då föreslår jag en titt på preg_replace syster preg_match http://se2.php.net/manual/en/function.preg-match.php
Speciellt argumentet matches

Men jag måste få modulen på exakt rätt plats :)

Citat:

Ursprungligen postat av WizKid
Är det en XML-fil du försöker parsa? Varför inte använda en XML-parser isåfall? Som till exempel simplexml

Nej, det är ett PHP script.

xarph 2008-04-19 22:34

Jao om det är XML så kan du köra någon random XML/RSS PHP-parser.

Men jag har skrivit en funktion i PHP som kan underlätta...

Kod:

function pattern ($start, $stop, $string)
{
  $pattern = "#" . $start . "(.*?)" . $stop. "#";
  preg_match_all($pattern, $string, $result);
  return $result[1];
}
function load($url, $bytes) //För php5
{
  if ($stream = @fopen($url, 'r'))
  {
        $html = stream_get_contents($stream, $bytes);
        fclose($stream);
  return $html;
  }
}

Exempel på hur funktionerna fungerar:

Kod:

$firstLoad = load("http://www.webmasternetwork.se/nya_tradar.xml", 323600);

// Den ska hämta allt som är mellan <title> och </title> men i ditt fall får du köra: $modules = pattern('<module>', '</module>', $firstLoad);
$titles = pattern('<title>', '</title>', $firstLoad);

// Första titeln

echo $titles[0];

// Printar ut alla titlar som en array.

print_r($titles)

O.s.v, du förstår nog precis hur det fungerar :D

KarlRoos 2008-04-20 14:37

Citat:

Originally posted by xarph@Apr 19 2008, 22:34
Jao om det är XML så kan du köra någon random XML/RSS PHP-parser.
Men jag har skrivit en funktion i PHP som kan underlätta...
Kod:

function pattern start, stop, string
{
 pattern = # . start . .*? . stop. #;
 preg_match_allpattern, string, result;
 return result1;
}
function loadurl, bytes //För php5
{
 if stream = @fopenurl, r
 {
        html = stream_get_contentsstream, bytes;
        fclosestream;
 return html;
 }
}

Exempel på hur funktionerna fungerar:
Kod:

firstLoad = loadhttp//www.webmasternetwork.se/nya_tradar.xml, 323600;
// Den ska hämta allt som är mellan title och /title men i ditt fall får du köra modules = patternmodule, /module, firstLoad;
titles = patterntitle, /title, firstLoad;
// Första titeln
echo titles0;
// Printar ut alla titlar som en array.
print_rtitles

O.s.v, du förstår nog precis hur det fungerar

Fint :) Men då kan jag inte köra modulen tillsammans med sidan (include),
tack ändå för att du försökte :)


Alla tider är GMT +2. Klockan är nu 08:01.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson