किसी तत्व के href विशेषता को हथियाना


114

एक पृष्ठ पर लिंक खोजने की कोशिश कर रहा है।

मेरा रेगेक्स है:

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

लेकिन लगता है पर विफल

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

किसी टैग में पहले नहीं लगाए गए href से निपटने के लिए मैं अपना रेगेक्स कैसे बदलूंगा?

जवाबों:


208

HTML के लिए विश्वसनीय Rexx मुश्किल हैं । यह डोम के साथ कैसे करना है :

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

ऊपर स्ट्रिंग में सभी तत्वों के "बाहरी HTML" को खोजा और आउटपुट किया जाएगा ।A$html

नोड के सभी पाठ मान प्राप्त करने के लिए , आप करते हैं

echo $node->nodeValue; 

यह देखने के लिए कि क्या hrefविशेषता मौजूद है आप कर सकते हैं

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

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

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

करने के लिए बदलने केhref गुण आपको बस इतना चाहते हैं

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

विशेषता को हटाने के hrefलिए आप क्या करेंगे

$node->removeAttribute('href'); 

आप एक्सपीथ केhref साथ सीधे विशेषता के लिए क्वेरी भी कर सकते हैं

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a/@href');
foreach($nodes as $href) {
    echo $href->nodeValue;                       // echo current attribute value
    $href->nodeValue = 'new value';              // set new attribute value
    $href->parentNode->removeAttribute('href');  // remove attribute
}

और देखें:

एक विचार पर: मुझे यकीन है कि यह एक डुप्लिकेट है और आप यहां कहीं जवाब पा सकते हैं


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

19

मैं गॉर्डन से सहमत हूं, आप HTML को पार्स करने के लिए HTML पार्सर का उपयोग करें। लेकिन अगर आप वास्तव में एक रेगेक्स चाहते हैं, तो आप इसे आज़मा सकते हैं:

/^<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"
}

बस जानकारी के लिए: यदि हम अभिव्यक्ति की तुलना में कई एक तत्वों से युक्त एक पाठ खोज (। *) गलत है
मीकल - wereda शुद्ध

5

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

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

1
क्या होगा यदि एंकर में अधिक विशेषताएं हैं?
फफूंद

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("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);करने के लिए सही ढंग से सभी href मान को पकड़ने के लिए उपयोग करने के लिए पुन: दावा करता हूंforeach($res as $key => $val){echo $val[1]}
इग्नासियो बस्टोस

3

जो अभी भी SimpleXML का उपयोग कर समाधान बहुत आसान और तेज नहीं मिलता है

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

मेरे लिए इसका काम करना


2

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

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


2

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

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

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

EDIT: परीक्षण किया गया


myregextester.com का उपयोग करते हुए - क्षमा करें, लिंक नहीं मिल रहा है
बेर्गन

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

क्या आप मुझे मेल करने के लिए पाठ बता सकते हैं? मैं उपयोग करता हूं:<a title="this" href="that">what?</a>
रूएल

1

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

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

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


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

0

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

यह परीक्षण किया गया है और यह किसी भी HTML कोड से सभी टैग प्राप्त करता है।


0

निम्नलिखित मेरे लिए काम कर रहा है और दोनों लौटाता है href और valueएंकर टैग की।

preg_match_all("'\<a.*?href=\"(.*?)\".*?\>(.*?)\<\/a\>'si", $html, $match);
if($match) {
    foreach($match[0] as $k => $e) {
        $urls[] = array(
            'anchor'    =>  $e,
            'href'      =>  $match[1][$k],
            'value'     =>  $match[2][$k]
        );
    }
}

बहुआयामी सरणी को कहा जाता है $urlsजिसमें अब सहयोगी उप-सरणियाँ हैं जो उपयोग करने में आसान हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.