2010-06-01 13 views
5

मैच के लिए यह mycodePhp नियमित अभिव्यक्ति एक div

<?php 

/** 
* @author Joomlacoders 
* @copyright 2010 
*/ 
    $url="http://urlchecker.net/html/demo.html"; 

    $innerHtml=file_get_contents($url); 

    //echo $innerHtml; 
    preg_match_all("{\<div id='news-id-.*d'\>(.*)\</div\>}",$innerHtml,$matches); 

      //<div id='news-id-160346'>    

    var_dump($matches); 

?> 

मैं div id में सभी सामग्री खोजने चाहते = 'समाचार-आईडी-160,346' है। मेरी मदद कृपया

उत्तर

6

Use an HTML parser. NOT regular expressions.

समस्या नियमित अभिव्यक्ति के साथ कि वे नेस्ट संरचनाओं से मेल नहीं कर सकते हैं। अपने रेगुलर एक्सप्रेशन से मान लिया जाये कि एक भी <div> और उसके बंद होने वाले टैग से मेल खाना चाहिए, वहाँ कोई रास्ता नहीं है सही ढंग से इस इनपुट मैच के लिए है:

<div id="a"> 
    <div id="b"> 
     Foo 
    </div> 
</div> 
<div id="c"> 
    Bar 
</div> 

क्योंकि अगर आपका रेगुलर एक्सप्रेशन लालची है, यह दो ऊपरवाला divs की भरपाई कर देंगे, और यह ungreedy अगर , यह सही अंत टैग से मेल नहीं खाएगा।

इसलिए, आपको एक HTML पार्सर का उपयोग करना चाहिए। PHP के साथ, DOMDocument::loadHTML या DOMDocument::loadHTMLFile प्रत्येक एक काफी अच्छी नौकरी करता है। (आप उत्पन्न होने वाली चेतावनियों को "सुरक्षित रूप से" अनदेखा कर सकते हैं: वे केवल मार्कअप त्रुटियां हैं, और जेनरेट DOMDocument ऑब्जेक्ट बहुत ठीक होना चाहिए।)

चूंकि PHP getElementById काम करने के लिए दर्द है, तो आप इसका उपयोग कर सकते हैं DOMXpath एक ही उद्देश्य के लिए:

<?php 

$url = "http://urlchecker.net/html/demo.html"; 

$d = new DOMDocument(); 
$d->loadHTMLFile($url); 

$xpath = new DOMXPath($d); 
$myNews = $xpath->query('//@id="news-id-160346"')->item(0); 

?> 
+0

हैलो मैंने सभी उत्तरों का प्रयास किया था लेकिन सफल नहीं चेतावनी: DOMDocument :: loadHTMLFile() [domdocument.loadhtmlfile]: अप्रत्याशित अंत टैग: http://urlchecker.net/html/demo.html में, लाइन: लाइन 10 – Thoman

+1

पर /home/urlcheck/public_html/html/test.php में 26 @ महिला: यह वास्तव में सफल रहा है। loadHTMLFile बस आपको पार्सिंग के दौरान सामना की जाने वाली समस्याओं को बताता है। आप इसे '@' ऑपरेटर के साथ बंद कर सकते हैं: '@ $ d-> loadHTMLFile ($ url);' – zneak

+0

मैं इसे आज़माता हूं लेकिन यह कोड id = 'news-id-160346' – Thoman

0

अन्य सुझावों के रूप में एक पार्सर का उपयोग करें।

या इस regex का प्रयास करें:

preg_match_all("#<div [^>]*id=['\"]news-id-\\d+['\"](.*?)</div>#", $innerHtml, $matches); 
print_r($matches); 

चेक क्यों regex एचटीएमएल पार्स करने के लिए सही उपकरण के रूप में नहीं माना जाता है print_r बयान के उत्पादन को समझने के लिए।

+0

में सभी सामग्री से मेल नहीं खाता है मैच, कृपया इसे ठीक करें – Thoman

+0

@ थॉमन फिर से मेरी आखिरी पंक्ति पढ़ें। यह मेल नहीं खाएगा - यह पूरा बिंदु है - इसे ठीक नहीं किया जा सकता है। – Amarghosh

+0

यह समझाने की देखभाल कि इसे क्यों कम किया गया था? – Amarghosh

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