2011-01-10 14 views
1

Ich möchte die <form> von der Website erhalten. Aber zwischen dem Formularteil in dieser Situation gibt es immer noch einen anderen HTML-Code. Wie man sie entfernt? Ich meine, wie man php nur regelmäßig verwendet und Teil von der Website?PHP Regex Problem

$str = file_get_contents('http://bingphp.codeplex.com'); 
preg_match_all('~<form.+</form>~iUs', $str, $match); 
var_dump($match); 
+0

Was meinst du "entfernen sie"? Du wolltest das '' und du hast es, mit allen Elementen darin. Was ist Ihre erwartete Leistung? – Kobi

Antwort

2

Sie sollten keine regulären Ausdrücke zum Extrahieren von HTML-Inhalt verwenden. Verwenden Sie eine DOM parser.

z.

$doc = new DOMDocument(); 
$doc->loadHTMLFile("http://bingphp.codeplex.com"); 

$forms = $doc->getElementsByTagName('form'); 

Update: Wenn Sie die Formulare entfernen (nicht sicher, ob Sie das gemeint ist):

for($i = $forms.length;$i--;) { 
    $node = $forms->item($i); 
    $node->parentNode->removeChild($node); 
} 

Update 2:

Ich habe gerade bemerkt, dass sie eine Form, die den ganzen Körper Inhalt umhüllt. So oder so, Sie werden die ganze Seite tatsächlich bekommen.

0

Der beste Weg, den ich denken kann, ist die Verwendung der Simple HTML DOM-Bibliothek mit PHP, um die Formulare von der HTML-Seite mit DOM-Abfragen zu erhalten.

Es ist ein wenig bequemer als die Verwendung von integrierten XML-Parsern wie Simplexml oder Domdocument.

Sie können the library hier finden.

1

Das Regex-Problem liegt in der Greedy. Für solche Fälle ist .+? ratsam.

Aber was @Felix sagte. Während ein regulärer Ausdruck für HTML Extraktion bearbeitbar ist, suchen Sie oft nach etwas Bestimmtem und sollten es daher lieber analysieren. Es ist auch viel einfacher, wenn Sie verwenden QueryPath:

$str = file_get_contents('http://bingphp.codeplex.com'); 
print qp($str)->find("form")->html(); 
+1

'. +?' Würde in diesem Fall fehlschlagen - sie haben '

' Tags * in JavaScript-Strings * verschachtelt! Oh nein, warum!? – Kobi

+0

@ Kobi. Wie wagen sie es! Hmm, ich wusste nicht, dass das in jedem Browser funktioniert. - Und dann bin ich nicht sicher, ob QueryPath die beste Option für PHP ist, da es DomDocument verwendet, das dafür möglicherweise nicht robust genug ist. – mario

+0

'' string sind normalerweise ein Problem und werden manchmal als '''' geschrieben. Jawohl. – Kobi

0

Normalerweise sollten Sie DOM verwenden, um HTML zu analysieren, aber in diesem Fall ist die Website ist sehr weit davon entfernt, Standard-HTML, mit einigen des Code an Ort und Stelle geändert durch Javascript. Es kann daher nicht in das DOM-Objekt geladen werden. Dies könnte beabsichtigt sein, um den Code zu verschleiern.

In jedem Fall ist es nicht so sehr Ihre RE (obwohl die Verwendung einer nicht-gierigen Übereinstimmung würde helfen), aber das Design der Website selbst, die Sie daran hindert zu analysieren, was Sie wollen.