2011-11-15 14 views
8

प्राप्त करने के लिए PHP का उपयोग करना मैं PHP में DOMElement ऑब्जेक्ट का उपयोग करने के तरीके को समझने में बड़ी समय से संघर्ष कर रहा हूं। मैं इस कोड पाया, लेकिन मैं वास्तव में मेरे लिए यकीन है कि यह लागू है नहीं कर रहा हूँ:डीओएम एलिमेंट

$dom = new DOMDocument(); 
$dom->loadHTML("index.php"); 

$div = $dom->getElementsByTagName('div'); 
foreach ($div->attributes as $attr) { 
    $name = $attr->nodeName; 
    $value = $attr->nodeValue; 
    echo "Attribute '$name' :: '$value'<br />"; 
} 

असल में मैं क्या एक विशेष id के साथ एक element के लिए डोम खोज करने के लिए है की जरूरत है, और इसके बाद मैं एक गैर निकालने के लिए की जरूरत है -मानक attribute (यानी जिसे मैंने बनाया और जेएस के साथ रखा) ताकि मैं इसका मूल्य देख सकूं। कारण है कि मुझे $_GET से एक टुकड़ा चाहिए और एक टुकड़ा जो एचटीएमएल में एक रीडायरेक्ट से आधारित है। अगर कोई इस बात के लिए सिर्फ डीओएमडी दस्तावेज़ का उपयोग कैसे कर सकता है, तो यह सहायक होगा। मैं वास्तव में समझ रहा हूं कि क्या हो रहा है और इसे ठीक से कैसे कार्यान्वित किया जाए, क्योंकि मैं स्पष्ट रूप से इसे सही नहीं कर रहा हूं।

संपादित करें (जहाँ मैं टिप्पणी के आधार पर पर हूँ):

<div id="column_profile"> 
    <?php 
     require_once($_SERVER["DOCUMENT_ROOT"] . "/peripheral/profile.php");    
     $searchResults = isset($_GET["s"]) ? performSearch($_GET["s"]) : ""; 

     $dom = new DOMDocument(); 
     $dom->load("index.php"); 

     $divs = $dom->getElementsByTagName('div'); 
     foreach ($divs as $div) { 
      foreach ($div->attributes as $attr) { 
       $name = $attr->nodeName; 
       $value = $attr->nodeValue; 
       echo "Attribute '$name' :: '$value'<br />"; 
      } 
     } 
     $div = $dom->getElementById('currentLocation'); 
     $attr = $div->getAttribute('srckey'); 
     echo "<h1>{$attr}</a>"; 
    ?> 
</div> 

<div id="column_main"> 

यहाँ मैं हो रही है त्रुटि संदेश है:

इस संदर्भ के लिए मेरी कोड लाइनों 4-26 है:

Warning: DOMDocument::load() [domdocument.load]: Extra content at the end of the document in ../public_html/index.php, line: 26 in ../public_html/index.php on line 10 

Fatal error: Call to a member function getAttribute() on a non-object in ../public_html/index.php on line 21 
+0

'index.hp' निष्पादित नहीं किया जाएगा। 'लोड HTML' फ़ाइल की सामग्री को पढ़ता है, यह इसे नहीं चलाता है। आपको कुछ ऐसा करने की आवश्यकता हो सकती है: '$ dom-> loadHTML (file_get_contents ('http: //localhost/index.php'))'। –

उत्तर

14

getElementsByTagName रिटर्न आप तत्वों की सूची है, तो पहले आप पाश करने के लिए तत्वों के माध्यम से, तो उनकी विशेषताओं के माध्यम से की जरूरत है।

$divs = $dom->getElementsByTagName('div'); 
foreach ($divs as $div) { 
    foreach ($div->attributes as $attr) { 
     $name = $attr->nodeName; 
     $value = $attr->nodeValue; 
     echo "Attribute '$name' :: '$value'<br />"; 
    } 
} 

आपके मामले में, आपने कहा कि आपको एक विशिष्ट आईडी की आवश्यकता है। उन, अद्वितीय होना चाहिए रहे हैं ताकि ऐसा करने के लिए, आप उपयोग कर सकते हैं (ध्यान दें getElementById जब तक आप $dom->validate() पहले फोन काम नहीं कर सकते):

$attr = $div->getAttribute('customAttr'); 

संपादित करें:

$div = $dom->getElementById('divID'); 

फिर अपने गुण प्राप्त करने के लिए: $dom->loadHTML बस फ़ाइल की सामग्री को पढ़ता है, यह उन्हें निष्पादित नहीं करता है। index.php इस तरह से नहीं खेला जाएगा। आपको कुछ ऐसा करना पड़ सकता है:

$dom->loadHTML(file_get_contents('http://localhost/index.php')) 
+1

क्या यह काम करता है यदि आपके एचटीएमएल में एक डॉक्टरेट घोषणा नहीं है? [DOMDocument :: getElementById] पर एक टिप्पणी (http://us3.php.net/manual/en/domdocument.getelementbyid.php) प्रलेखन पृष्ठ से पता चलता है कि यदि HTML में एक डॉक्टरेट घोषणा नहीं है। 'getElementById()' हमेशा 'शून्य' देता है। –

+0

सुनिश्चित नहीं है कि वह टिप्पणी क्या कहने का प्रयास कर रही है। 'DOMDocument'' 'के बिना HTML पर ठीक काम करता है। डेमो: https://3v4l.org/0mGrg –

+0

हां, मैं इस तरह से HTML लिखने के लिए डोम लाइब्रेरी का उपयोग कर रहा हूं। लेकिन मैं बनाये गये एचटीएमएल के खिलाफ परीक्षण चलाने की कोशिश कर रहा हूं।'getElementById()' हमेशा 'शून्य' देता है जब भी यह स्पष्ट रूप से प्रस्तुत HTML में होता है। –

1

यदि रीडायरेक्ट बाहरी सर्वर से है तो आपको HTML तक पहुंच नहीं होगी। मुझे इसे इस तरह से रखने दें: उस बिंदु पर डोम मौजूद नहीं है जिस पर आप इसे पार्स करने की कोशिश कर रहे हैं। आप क्या कर सकते हैं पाठ को एक डोम पार्सर में पास कर दें और फिर उस तरह के तत्वों का उपयोग करें। या बेहतर तरीका इसे एक और जीईटी वैरिएबल के रूप में जोड़ना होगा।

संपादित करें: क्या आप यह भी जानते हैं कि क्लाइंट HTML को बदल सकता है और जो भी चाहें उसे पास कर सकता है? (फायरबग जैसे टूल का उपयोग करना)

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