PHP Text aus anderer Seite integrieren

Jeak

Lt. Junior Grade
Registriert
Sep. 2007
Beiträge
373
Hey!

Würde gerne einen Teil des Textes einer Webseite in eine andere integrieren.

Also die Seite /show.php soll durch ein PHP-Script o.Ä. den Text auf /back.html "durchlesen" und z.B. den Text hinter "Datum: " übernehmen und ausgeben.
Ist so was irgendwie möglich? :)

Würde mich sehr über Tipps freuen.
 
- file_get_contents() zum einlesen der Datei
- preg_match_all() mit einem passenden regulären Suchmuster zum Ausfiltern der Angaben hinter "Datum: "
 
Ich kenn mich jetzt speziell mit PHP nicht aus, aber öffne die "back.html" doch einfach wie eine ganz normale Textdatei, speichere sie in einem String.
Dann kannst du einfach den String nach "Datum: " durchsuchen und das, was danach kommt, in eine andere Variable zwischenspeichern oder sonst wie verarbeiten.

Gruß Timo
 
Super, vielen dank!
Werde nach dem Mittagessen mal ausprobieren, ob es funktioniert :)
Melde mich danach wieder.
 
Des is relativ schwer, ohne Marker, nach denen man sich richten kann. Am einfachsten ist es z.B., wenn du den Abschnitt, den du aus der back.html haben willst, mit einem HTML-Kommentar umschließt, z.B.:

HTML:
Hier ist ganz viel Text, den du nicht haben willst....
<!--c-->
Datum: und noch mehr text hier... 
<!--/c-->
Und hier ist wieder ganz viel Text, den du nicht haben willst...

dann kannste nämlich mit:

PHP:
<?php
// Datei "back.html" einlesen
$template = file_get_contents("back.html");

// Nach dem Marker suchen und gefundenes in $match speichern
// Die erste Raute bestimmt den Anfang des Suchmusters, die zweite Raute das Ende. 
// Das "s" hinter der zweiten Raute sagt der Suchfunktion, dass du über mehrere Zeilen suchen willst,
// das "i" sagt, dass du nicht-case-sensitive suchen willst.
// (.*?) sagt, dass dir egal ist wie viele und welche Zeichen im Treffer vorhanden sind.
$find = preg_match("#<!--c-->(.*?)<!--/c-->#si", $template, $match);

if($find):
    // wenn $find  wahr ist, dann Inhalt von $match ausgeben
    print_r($match);
else:
    echo "nix gefunden :(";
endif;
?>

genau das raussuchen, was du haben willst. Mit der Funktion preg_match_all kannst du das Dokument auch nach allen diesen Markern durchsuchen, wenn du mehrere solcher Marker verwenden willst ;)
 
Zuletzt bearbeitet:
Wenn das "Datum:" sicher exakt einmal vorkommt, dann reicht auch

PHP:
$pos = strpos($text=file_get_contents("www.123.de"),"Datum:");
$result = ($pos===false) ? "nichts gefunden" : substr($text, $pos);


edit: achja, ungestestet, und da is natürlich das Wort "Datum:" selbst noch enthalten, aber dürfte ja kein Problem sein, es zu ändern.
 
Zuletzt bearbeitet:
Vielen Dank nochmal an alle :)
Hat wunderbar funktioniert, so wie ich das wollte.
 
Du hattest zwar eindeutig am meisten Arbeit mit deinem Tipp, aber da ich genau weiß, dass der Text davor (in meinem Beispiel "Datum: ") auf jeden Fall vorkommt, konnte ich eine abgewandelte Form von caroms Vorschlag benutzen :)

Überlege nur, ob man das nicht noch mit vernünftigen Parametern für file_get_contents vereinfachen könnte...
 
Naja, "am meisten Arbeit", des hab ich noch im Halbschlaf geschrieben sozusagen^^ Ich hab so in der Art und Weise meine eigene Template-Engine geschrieben, von daher gings ;)

Aber ob man caroms lösung da vereinfachen muss - weiß nicht, des einzige wäre ja die genaue Position des Cursors anzugeben, glaub des würds aber eher verkomplizieren^^
 
TchiboMann schrieb:
PHP:
<?php
// Datei "back.html" einlesen
$template = file_get_contents("back.html");

// Nach dem Marker suchen und gefundenes in $match speichern
// Die erste Raute bestimmt den Anfang des Suchmusters, die zweite Raute das Ende. 
// Das "s" hinter der zweiten Raute sagt der Suchfunktion, dass du über mehrere Zeilen suchen willst,
// das "i" sagt, dass du nicht-case-sensitive suchen willst.
// (.*?) sagt, dass dir egal ist wie viele und welche Zeichen im Treffer vorhanden sind.
$find = preg_match("#<!--c-->(.*?)<!--/c-->#si", $template, $match);

if($find):
    // wenn $find  wahr ist, dann Inhalt von $match ausgeben
    print_r($match);
else:
    echo "nix gefunden :(";
endif;
?>

Wenn ich dieses Beispiel verwende, erhalte ich im anzuzeigenden Text:

Array ( [0] => "Hallo Welt". Wo liegt der Fehler?
 
Ich denke es ist kein Fehler? $match ist ein Array, das mit print_r auch genauso ausgegeben wird. Und ich gehe davon aus, dass Hallo Welt auch in deiner eingebundenen Datei steht. Somit hat alles funktioniert :)


so long
Renegade
 
Nö, desis völlig korrekt, so wie Renegade des sagt.

du musst im Abschnitt

PHP:
if($find): 
    // wenn $find  wahr ist, dann Inhalt von $match ausgeben 
    print_r($match); 
else: 
    echo "nix gefunden :("; 
endif;

das Script natürlich an deine Bedürfnisse anpassen. Der Befehl "print_r($match);" gibt dir aus, was die Funktion preg_match() gefunden hat, und das ist üblicherweise ein Array mit den Daten, die er gefunden hat.

Wenn bei dir in deiner html-Datei das hier steht:

HTML:
Blabliblu irgendwas...
<!--c-->
Hallo Welt!
<!--/c-->
und hier dann wieder irgendwas...

dann gibt er dir auch entsprechend "Hallo Welt" aus. Und diesen Wert kannst du dann mit

PHP:
$match[0]

entsprechend aufrufen, beispielsweise mit

PHP:
echo $match[0];

print_r dient nur dazu ein Array automatisch durchzuschauen und dessen Inhalt auszugeben.
 
TchiboMann schrieb:
print_r dient nur dazu ein Array automatisch durchzuschauen und dessen Inhalt auszugeben.

Super. Vielen Dank! Jetzt klappt es. Jetzt hab ich nur n Problem, wenn ich den Text zwischen verschiedenen Sprungmarken in eine weitere Bedingung setzen will.

Funktioniert:
PHP:
$template = file_get_contents("back.html"); 
$find = preg_match("#<!--d-->(.*?)<!--/d-->#si", $template, $match);
 if($find): 
    // wenn $find  wahr ist, dann Inhalt von $match ausgeben 
    print_r($match); 
else: 
    echo "nix gefunden :("; 
endif;

Funktioniert nicht:
PHP:
$template = file_get_contents("back.html"); 
$find1 = preg_match("#<!--c-->(.*?)<!--/c-->#si", $template, $match1);
$find2 = preg_match("#<!--d-->(.*?)<!--/d-->#si", $template, $match2);

if($find1): 
    // wenn $find1  wahr ist, dann Inhalt von $match1 ausgeben 
    print_r($match1);

if($find2): 
    // wenn $find2  wahr ist, dann Inhalt von $match2 ausgeben 
    print_r($match2); 
else: 
    echo "nix gefunden :("; 
endif;

Hmm, ich hab halt keine Ahnung und schustere mir Codeschnippsel zusammen wie ich sie zusammen mit meinem CMS einsetzen kann. Also sorry für Dummschwatz aus Grund der Unwissenheit.
 
Zuletzt bearbeitet:
Nönö keine Panik, da nehm ich solang nix übel wie jemand auch Bereitschaft signalisiert zu lernen und Hilfe zu schätzen weiß ;)

Meine Frage ist nun: Willst du beide Suchmuster auf alle Fälle finden und auswerten, oder willst du <!--c--> vor <!--d--> priorisieren? Sprich, wenn <!--c--> vor <!--d--> gefunden wird soll nur <!--c--> ausgegeben werden?

Denn DANN müsste bei der zweiten if-Bedingung nur ein "else" noch vorangestellt werden:

PHP:
$template = file_get_contents("back.html"); 
$find1 = preg_match("#<!--c-->(.*?)<!--/c-->#si", $template, $match1);
$find2 = preg_match("#<!--d-->(.*?)<!--/d-->#si", $template, $match2);

if($find1): 
    // wenn $find1  wahr ist, dann Inhalt von $match1 ausgeben 
    print_r($match1);

elseif($find2): 
    // wenn $find2  wahr ist, dann Inhalt von $match2 ausgeben 
    print_r($match2); 
else: 
    echo "nix gefunden :("; 
endif;

In dem Fall würde wenn $find1 wahr ist $find2 nicht mehr berücksichtigt, wenn $find1 unwahr ist würde $find2 noch ausgewertet.


Wenn du aber ALLE Marker finden willst, dann würde ich mit preg_match_all arbeiten. Da das ganze etwas "umfangreicher" ist, hab ich mal ein Beispielscript geschrieben und dort drin die jeweiligen Erklärungen als Kommentar eingefügr. NATÜRLICH ist das blos ein grober Anriss und kann/muss/sollte dann von dir weiterentwickelt werden ;) Theoretisch könntest du durch geschickte Namensgebung unterschiedliche Templatenamen für unterschiedliche Zwecke nutzen, OHNE dass du dafür eine Extra-Templatedatei brauchst.


Okay, genug der vielen Worte, hier das PHP-Script:

PHP:
<?php
// Datei "back.html" einlesen
$template = file_get_contents("back.html");

// Nach allen Markern suchen und gefundenes in $matches speichern
// Die erste Raute bestimmt den Anfang des Suchmusters, die zweite Raute das Ende.
// Das "s" hinter der zweiten Raute sagt der Suchfunktion, dass du über mehrere Zeilen suchen willst,
// das "i" sagt, dass du nicht-case-sensitive suchen willst.
//
// Dafür nötiges RegEx-Pattern: <!--([a-z0-9_\-]+)-->(.*?)<!--/\\1-->
// Zur Erklärung:
// ([a-z0-9_\-]+)   sucht zwischen <!-- und --> nach Zahlen und Buchstaben, sowie Unterstrich _
//                  und Minuszeichen -, wobei dieses mittels eines Backslashes \ escaped werden muss,
//                  sonst gibt's nen Fehler. Das Pluszeichen hinter ] besagt, dass nicht nur EIN Zeichen,
//                  sondern beliebig viele Zeichen vorkommen können und berücksichtigt müssen. Begrenzen
//                  kann man die Anzahl der Zeichen so:
//                  ([a-z0-9_\-]{1,10})
//                  Statt des Plus-Zeichens die geschweiften Klammern, in dem Fall müssen mindestens 1 Zeichen 
//                  und dürfen maximal 10 Zeichen vorhanden sein.
// (.*?)            sucht nach dem Content, der zwischen den Markern sitzt und speichert sie im Array
//                  $matches, welches man mittels print_r testweise komplett ausgeben kann.
// <!--/\\1-->      dies ist der "Endmarker". Wichtig sind die beiden Backslashes und die 1. Im
//                  Anfangsmarker steht beispielsweise <!--hallo-welt-->, im Endmarker <!--/hallo-welt-->, hallo-welt
//                  ist also der Wert, der in beiden Markern stehen muss. Doch da man ALLE Marker haben will,
//                  ist es dumm, wenn man nach fix vorgegebenen Markernamen sucht - klug ist es, wenn man ALLE
//                  Markernamen mit einem Suchvorgang aufnimmt. Durch die Angabe \\1 wird der erste Treffer,
//                  der mittels ([a-z0-9_\-]+) gefunden wurde, in \\1 gespeichert, sodass der Anfangsmarker
//                  und der Endmarker dieselben Werte haben, und nicht plötzlich zwei unpassende Marker wie
//                  <!--hallo-welt--> irgendeintext hier <!--/welt-hallo--> gefunden und so völlig
//                  unerwünschte Ergebnisse ausgeliefert werden..


// suche nach allen Markern:
$find = preg_match_all("#<!--([a-z0-9_\-]{1,8})-->(.*?)<!--/\\1-->#si", $template, $matches);


if($find):
    // wenn $find  wahr ist, dann Inhalt von $match ausgeben
    echo "<pre>"; 
    print_r($matches);
    echo "</pre>";
else:
    echo "nix gefunden :(";
endif;
?>


Passendes HTML-Template:

HTML:
Dieser Text wird nicht genommen...<br/>

<!--tpl_bla-->Bla, ganz viel Text!<!--/tpl_bla-->

<br/>Und dieser Text wird auch nicht genommen...<br/>

<!--c-->Und das hier will ich haben!!!<!--/c-->

<br/>Und auch dieser Text wird völlig ignoriert...<br/>

<!--hallo-007-->Und hier will ich auch nix mehr haben<!--/hallo-007-->
 
Zurück
Oben