2010-09-29 16 views
106

किसी पृष्ठ पर लिंक ढूंढने का प्रयास कर रहा है।किसी तत्व के href विशेषता को पकड़ना

मेरी regex है:

/<a\s[^>]*href=(\"\'??)([^\"\' >]*?)[^>]*>(.*)<\/a>/ 

लेकिन

<a title="this" href="that">what?</a> 

में विफल रहा href से निपटने के लिए मेरी regex कैसे बदल जाएगा टैग में पहले रखा नहीं लगता है?

उत्तर

193

Reliable Regex for HTML are difficult परीक्षण किया गया:

<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>

मैं व्यक्तिगत रूप से सुझाव है कि आप एक HTML Parser

संपादित करें का उपयोग करें।

$dom = new DOMDocument; 
$dom->loadHTML($html); 
foreach ($dom->getElementsByTagName('a') as $node) { 
    echo $dom->saveHtml($node), PHP_EOL; 
} 

ऊपर मिलेगा और उत्पादन $html स्ट्रिंग में सभी A तत्वों की "outerHTML": यहां बताया DOM साथ यह करने के लिए है।

करने के लिए नोड के सभी पाठ मान मिलता है, आप अगर href विशेषता मौजूद है

echo $node->nodeValue; 

जांच करने के लिए आप क्या कर सकते हैं

echo $node->hasAttribute('href'); 

करने के लिएhref मिलता है विशेषता जो आप करेंगे

echo $node->getAttribute('href'); 

परिवर्तन करने के लिए href विशेषता तुम क्या चाहते हैं

$node->setAttribute('href', 'something else'); 

निकालनेhref विशेषता

$node->removeAttribute('href'); 

तुम भी सीधे href विशेषता के लिए क्वेरी कर सकते हैं चाहते हैं XPath

के साथ

यह भी देखें:

एक sidenote पर: मुझे यकीन है कि यह डुप्लिकेट है हूँ और तुम find the answer somewhere in here

+0

HTML को पार्स करने के लिए विश्वसनीय रेगेक्स मूल रूप से असंभव है क्योंकि HTML नियमित भाषा नहीं है। – Asciiom

3

क्यों तुम सिर्फ

"<a.*?href\s*=\s*['"](.*?)['"]" 

<?php 

$str = '<a title="this" href="that">what?</a>'; 

$res = array(); 

preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res); 

var_dump($res); 

?> 

तो

$ php test.php 
array(2) { 
    [0]=> 
    array(1) { 
    [0]=> 
    string(27) "<a title="this" href="that"" 
    } 
    [1]=> 
    array(1) { 
    [0]=> 
    string(4) "that" 
    } 
} 

जो काम करता है मेल नहीं खाते। मैंने पहले कैप्चर ब्रेसेस को हटा दिया है।

+2

मैं 'preg_match_all उपयोग करने के लिए (सिफारिश] (। *?) ['\ "] /", $ str, $ res, PREG_SET_ORDER); '' foreach ($ res = $ $ val के रूप में $ res) का उपयोग करने में सही ढंग से सभी href मानों को पकड़ने के लिए {echo $ val [1]} ' –

+0

@IgnacioBustos ने ठीक काम किया – mostafaznv

5

पैटर्न आप लिंक लंगर पैटर्न (कुछ) की तरह है, हो सकता है देखने के लिए चाहते हैं:

$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/"; 
+1

क्या एंकर के अधिक गुण हैं? – funerr

1

त्वरित परीक्षण: <a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a> चाल करने के लिए लगता है, 1 मैच जा रहा है "या के साथ ', दूसरा 'href' मान 'वह', और तीसरा 'क्या?'

कारण मैंने "/ 'का पहला मैच छोड़ा है, यह है कि आप इसे बाद में बंद करने के लिए बैकरेफर करने के लिए उपयोग कर सकते हैं"/'तो यह वही है।

लाइव उदाहरण देखें: http://www.rubular.com/r/jsKyK2b6do

+0

काम नहीं करता है, क्षमा करें – bergin

+1

@bergin कृपया निर्दिष्ट करें, क्या काम नहीं करता है? मुझे आपके परीक्षण HTML में href से सटीक मान मिलता है। आप क्या उम्मीद कर रहे हैं कि यह नहीं करता है? मैं देखता हूं कि आप परीक्षण के लिए एक अलग साइट का उपयोग करते हैं, वहां भी मुझे आपके उदाहरण से 'href' मान सफलतापूर्वक मिलता है। http://www.myregextester.com/?r=d966dd6b – CharlesLeaf

2

मुझे यकीन है कि आप यहाँ करने के लिए कोशिश कर रहे हैं क्या नहीं कर रहा हूँ, लेकिन अगर आप लिंक को मान्य करने की कोशिश कर रहे तो PHP के filter_var()

को देखो क्या तुम सच में तो रेगुलर एक्सप्रेशन का उपयोग करने की आवश्यकता है इस टूल को देखें, इससे मदद मिल सकती है: http://regex.larsolavtorvik.com/

2

अपने रेगेक्स का उपयोग करके, मैंने आपकी आवश्यकता के अनुरूप इसे थोड़ा सा संशोधित किया।

+0

myregextester.com का उपयोग करके - क्षमा करें, – bergin

+0

@bergin लिंक नहीं मिला, हाय मैंने अपना जवाब संशोधित किया, और यह अब काम करता है। – Ruel

+0

यह कहता है: कोई मिलान नहीं। DELIMITER संग्रह के लिए जांचें। – bergin

16

मैं गॉर्डन के साथ सहमत कर सकते हैं, HTML को पार्स करने के लिए आपको एक HTML पार्सर का उपयोग करना होगा। लेकिन अगर आप वास्तव में एक regex चाहते तुम कोशिश कर सकते यह एक:

/^<a.*?href=(["\'])(.*?)\1.*$/ 

इस स्ट्रिंग की शुरुआत में <a से मेल खाता है, किसी भी वर्ण के किसी भी संख्या के बाद (गैर लालची) .*? तो href= से घिरा हुआ लिंक के द्वारा पीछा किया या तो " या '

$str = '<a title="this" href="that">what?</a>'; 
preg_match('/^<a.*?href=(["\'])(.*?)\1.*$/', $str, $m); 
var_dump($m); 

आउटपुट:

array(3) { 
    [0]=> 
    string(37) "<a title="this" href="that">what?</a>" 
    [1]=> 
    string(1) """ 
    [2]=> 
    string(4) "that" 
} 
+0

केवल जानकारी के लिए: यदि हम अभिव्यक्ति (। *?) से कई तत्वों वाले टेक्स्ट में खोज करते हैं तो गलत है –

0

preg_match_all ("/ (] >) (। ?) (</ए)/", $ सामग्री, $ impmatches, PREG_SET_ORDER);

यह परीक्षण किया है और यह किसी भी html कोड से सभी एक टैग लाने

2

एक है जो अभी भी नहीं मिल के लिए। "/ <एक। *? href \ s * = \ s * [ '\" बहुत आसान और तेजी से मेरे लिए काम कर SimpleXML

$a = new SimpleXMLElement('<a href="www.something.com">Click here</a>'); 
echo $a['href']; // will echo www.something.com 

इसका उपयोग करते हुए समाधान

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