preg_match_all gibt keinen treffer aus
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
array
auslese
code
dom
element
ergebnis
existieren
file
frage
inhalt
input
not
platzhalter
schonender dom
simple aufgabe
string
tag
treffer
url
welt
-
Ich hab mir ein bisschen über preg_match_all durchgelesen und daraufhin folgendes script erstellt:
<?php $treffer = array(); $url = 'meinPfad/meineDatei.php'; $input = @file_get_contents($url) or die('Could not access file: $url'); if ( preg_match_all('#<div id="contents">(.*)</div>#', $input, $treffer ) ) { echo $treffer; } ?>
Allerdings bekomme ich keine ausgabe, obwohl ich mit 100%iger sicherheit weiß, dass die div existiert.... -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
<?php $string = "<div id="contents">hallo welt!</div>"; $regex = "#<div id="contents">(.*)</div>#"; preg_match_all ($regex, $string, $output, PREG_PATTERN_ORDER); ?> Array ( [0] => Array ( [0] => <div id="contents">hallo welt!</div> ) [1] => Array ( [0] => hallo welt! ) )
Das tag/element">Element scheint nicht zu existieren. Ich frage jetzt aber auch nicht, warum du preg_match nutzt, für diese simple Aufgabe ;)
Beitrag zuletzt geändert: 26.1.2012 13:20:23 von fabo -
fabo schrieb:
Das Element scheint nicht zu existieren. Ich frage jetzt aber auch nicht, warum du preg_match nutzt, für diese simple Aufgabe ;)
Die div steht genau äh 3 zeilen über dem php code...
Ich will eben via file_get_contentest() eine datei einlesen, die x-beliebig sein soll, dann mit preg_match_all prüfen ob die Datei existiert und dann Alles zwischen der div ausgeben, damit ich es später editieren kann... Man könnte sagen "Beitrag editieren" kommt dem schon sehr nahe... -
fabo schrieb:
Fakt ist, dass die Regexpression funktioniert, wie erwartet.
$treffer[1] enthält den Treffer. preg_match_all liefert ein Array zurück, keinen String. Nur so nebenbei ;)
treffer ist ja auch als array definiert, siehe erster Post, aber trotzdem bleibt der array leer und in meiner if-anweisung hat er gar keinen wert... -
cptgame schrieb:
fabo schrieb:
Ich frage jetzt aber auch nicht, warum du preg_match nutzt, für diese simple Aufgabe ;)
wie würde es denn anders gehen ? ... Ressourcen schonender !?
DOM Element auslesen ?
über strstr() oder strpos() ?
strstr() lässt keine Platzhalter zu, wie ich es habe "(.*?)", soll heißen, dass alles zwischen der div ausgelesen wird... -
<?php $treffer = array(); $url = 'meinPfad/meineDatei.php'; $input = @file_get_contents($url) or die("Could not access file: $url"); if ( preg_match_all('#<div id="contents">(.*)</div>#', $input, $treffer, PREG_PATTERN_ORDER ) ) { echo $treffer[1][0]; } ?>
Funktioniert definitiv.
(.*?) ist kein "Platzhalter", sondern ein regulärer Ausdruck...
@cptgame
Dom ist schon die richtige Richtung :)
<?php $tags = array(); $dom = new DOMDocument; $dom->loadHTML('<html><body><div id="contents">hallo welt!</div></body></html>'); $contents = $dom->getElementById('contents'); foreach ($tags as $tag) { echo $tag->nodeValue; } ?>
So, oder so ähnlich würde ich es machen. -
fabo schrieb:
<?php $treffer = array(); $url = 'meinPfad/meineDatei.php'; $input = @file_get_contents($url) or die("Could not access file: $url"); if ( preg_match_all('#<div id="contents">(.*)</div>#', $input, $treffer, PREG_PATTERN_ORDER ) ) { echo $treffer[1][0]; } ?>
Funktioniert definitiv.
So, oder so ähnlich würde ich es machen.
Ist das getestet bei dir? :/ Bei mir geht es leider nicht... wenn ich das 1:1 kopiere und den Pfad ändere passiert gar nichts.... Meine div heißt<div id="contents">
-
kill-a-teddy schrieb:
strstr() lässt keine Platzhalter zu, wie ich es habe "(.*?)", soll heißen, dass alles zwischen der div ausgelesen wird...
ja, schon wahr,
also anders ran gehen, evtl halt mit strpos()
1. suche Position1 am Ende des $teilstring1 = '<div id="contents">';
2. suche Position2 am Anfang des $teilstring2 = '</div>';
3. Hole String zwischen Position1 und Position2 in neue Variable ($treffer)
aber wenn innerhalb des <div id="contents"> weitere andere <DIV> Tags sind
dann wird das Ergebnis zu früh abgeschnitten .... evtl doch DOM Element ?
habs es mal so getestet
$html = ' <body> <div id="page"> <div id="content"> <div class="post"> <div>Text1</div> <div>Text2</div> </div> </div> blablabla </div> </body> '; $dom = new DOMDocument(); $dom->loadHTML($html); $element = $dom->getElementById('content'); $inhalt = $dom->saveHTML($element);
Ausgabe von $inhalt bekomme ich aber auch inklusive <div id="content"> .. </div>
<div id="content"> <div class="post"> <div>Text1</div> <div>Text2</div> </div> </div>
aber es soll ja nur der Inhalt von <div id="content"> (DAS HIER ) </div> als Treffer sein
kann man evtl was mit child oder nodeValue machen ?
Beitrag zuletzt geändert: 26.1.2012 14:46:16 von cptgame -
Ist getestet...
mach an Stelle von
echo $treffer[1][0];
mal
die(var_dump($treffer));
Und entferne mal das @ vor file_get_contents...
Beitrag zuletzt geändert: 26.1.2012 14:47:19 von fabo -
cptgame schrieb:
also anders ran gehen, evtl halt mit strpos()
Ich glaub ich bin dir ein Dankeschön schuldig. strpos hat mich auf die richtige Lösung gebracht :)
<?php $content = @file_get_contents("meinPfad/meineDatei.php"); $pos1 = (strpos($content, '<div id="contents">')+19); $pos2 = strpos($content, '/#contents'); $ergebnis = substr($content, $pos1, $pos2-$pos1); echo $ergebnis; ?>
Beitrag zuletzt geändert: 26.1.2012 15:22:54 von kill-a-teddy -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage