2012-06-29 9 views
13

जो मैं करने की कोशिश कर रहा हूं वह एक PHP फ़ाइल (एक समस्या नहीं) के भीतर एक HTML फ़ाइल शामिल है, लेकिन HTML फ़ाइल को इसके लिए उपयोग करने योग्य भी होना चाहिए विभिन्न कारणों से, मुझे यह जानने की ज़रूरत है कि PHP के संदर्भ में मैं डॉक्ट टाइप, एचटीएमएल, हेड और बॉडी टैग को कैसे रोक सकता हूं, यदि यह संभव है।DOCTYPE, एचटीएमएल, हेड और बॉडी टैग के बिना शरीर की सामग्री प्राप्त करें

मैं PHP (doh!) पर विशेष रूप से अच्छा नहीं हूं इसलिए PHP मैनुअल और वेब पर मेरी खोज ने मुझे यह समझ नहीं पाया है। मतलब है कि किसी भी मदद या पढ़ने युक्तियाँ, या दोनों, बहुत सराहना की है।

$d = new DOMDocument; 
$mock = new DOMDocument; 
$d->loadHTML(file_get_contents('/path/to/my.html')); 
$body = $d->getElementsByTagName('body')->item(0); 
foreach ($body->childNodes as $child){ 
    $mock->appendChild($mock->importNode($child, true)); 
} 

echo $mock->saveHTML(); 

http://codepad.org/MQVQ3XQP

किसी को देखने के लिए है कि "एक दूसरे को", संशोधन देखना चाहते हैं:

+7

उपयोग एक डोम पार्सर और 'body' की सामग्री को मिलता है। – jeroen

+0

और आपकी स्थिति का मतलब है कि एचटीएमएल फाइल को पीएचपी से पहले भागों में तोड़ा नहीं जा सकता है? यह सामान्य स्थिति में एक पूरा दस्तावेज है? –

+1

[PHP डोम पार्सर] (http://php.net/manual/en/book.dom.php) का उपयोग करें, दस्तावेज़ लोड करें, बॉडी टैग ढूंढें, और इसके अंदर सबकुछ पकड़ लें। एक बार ऐसा करने के बाद, फ़ाइल को साफ़ करें और सामग्री को खाली फ़ाइल में आउटपुट करें। यह आपको केवल शरीर टैग के अंदर जो कुछ भी था, उसके साथ छोड़ देगा, और कुछ नहीं। – faino

उत्तर

14

के बाद से substr() विधि बहुत ज्यादा कुछ निगल करने के लिए के लिए लग रहा था, यहाँ एक डोम पार्सर विधि है ।

+0

' ... ' – tobyodavies

+0

तो यही वजह है कि आपने मुझे कम किया? एक चेतावनी थी कि कुछ मामलों में यह स्रोत के आधार पर काम नहीं करेगा। –

+0

यह एचटीएमएल पार्स करने के लिए regexes का उपयोग करने से सख्ती से भी बदतर है। और हम सभी जानते हैं कि इस बारे में कैसा महसूस होता है। यह अधिकांश डोम पार्सर्स का उपयोग करने से अधिक कोड है और यह कम मजबूत है। – tobyodavies

4

DOMDocument उपयोग क्या आप के बजाय जरूरत पट्टी आप (PHP> = 5.3.6) की जरूरत नहीं है क्या रखने के लिए

$d = new DOMDocument; 
$d->loadHTMLFile($fileLocation); 
$body = $d->getElementsByTagName('body')->item(0); 
// perform innerhtml on $body by enumerating child nodes 
// and saving them individually 
foreach ($body->childNodes as $childNode) { 
    echo $d->saveHTML($childNode); 
} 
+0

'$ d-> saveHTML()' भाग काम नहीं कर रहा है: http://codepad.org/2N00eots –

+0

@JaredFarrish फिर से अपना कोडपैड देखें और फिर मेरा कोड देखें। –

+0

ठीक है। मैं क्या खो रहा हूँ? मैं फ़ाइल लोडर के बजाय 'loadHTML()' का उपयोग करता हूं। –

2

एक डोम पार्सर का प्रयोग करें। इस परीक्षण किया लेकिन नहीं है कि आप क्या चाहते

$domDoc = new DOMDocument(); 
$domDoc.loadHTMLFile('/path/to/file'); 
$body = $domDoc->GetElementsByTagName('body')->item(0); 
foreach ($body->childNodes as $child){ 
    echo $child->C14N(); //Note this cannonicalizes the representation of the node, but that's not necessarily a bad thing 
} 

आप cannonicalization से बचना चाहते हैं, तो आप this version (@Jared Farrish करने के लिए धन्यवाद) का उपयोग कर सकते करना चाहिए

+0

आप वास्तव में मार्कअप को पूरी तरह से अलग कर रहे हैं: http://codepad.org/HXOTM9hi –

+0

अरे, 'सी 14 एन 'से बचने की उम्मीद कर रहा था, लेकिन मुझे लगता है कि आपको एक पार्सर का उपयोग करना होगा ... – tobyodavies

+0

अच्छा, आप ... http://codepad.org/MQVQ3XQP –

2

आप पीएचपी साफ एक्सटेंशन का उपयोग कर सकते हैं जो कर सकते हैं अवैध एक्सएचटीएमएल संरचनाओं ठीक हो (इस स्थिति DOMDocument लोड दुर्घटनाओं में) है और यह भी शरीर ही निकालें:

$tidy = new tidy(); 
$htmlBody = $tidy->repairString($html, array(
    'output-xhtml' => true, 
    'show-body-only' => true, 
), 'utf8'); 

फिर DOMDocument में निकाले शरीर लोड:

$xml = new DOMDocument(); 
$xml->loadHTML($htmlBody); 

फिर पार, निकालने, एक्सएमएल नोड्स आदि चारों ओर ले जाने .. और बचाने:

$output = $xml->saveXML(); 
-1

यह एक समाधान हो सकता है। मैंने कोशिश की और यह ठीक काम करता है।

function parseHTML(string) { 
 
     var parser = new DOMParser 
 
    , result = parser.parseFromString(string, "text/html"); 
 
     return result.firstChild.lastChild.firstChild; 
 
    }

+0

ओपी ने PHP समाधान के लिए पूछा, जेएस नहीं। – HelpNeeder

-1
$site = file_get_contents("http://www.google.com/"); 

preg_match("/<body[^>]*>(.*?)<\/body>/is", $site, $matches); 

echo($matches[1]); 
+3

क्या आप उत्तर को और अधिक पूरा करने के लिए, अपने उत्तर के कुछ स्पष्टीकरण भी जोड़ सकते हैं – Matt

संबंधित मुद्दे