একটি উপাদানগুলির href বৈশিষ্ট্যটি ধরে নেওয়া


114

কোনও পৃষ্ঠায় লিঙ্কগুলি সন্ধান করার চেষ্টা করা হচ্ছে।

আমার রেজেক্সটি হ'ল:

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

তবে ব্যর্থ বলে মনে হচ্ছে

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

আমি ট্যাগটিতে প্রথম স্থান না পাওয়ায় হেরেফের সাথে ডিল করার জন্য আমি কীভাবে আমার রেজেক্স পরিবর্তন করব?

উত্তর:


208

এইচটিএমএল এর জন্য নির্ভরযোগ্য রেইজেক্সগুলি কঠিন । এটি ডিওএম দিয়ে কীভাবে করবেন তা এখানে :

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

উপরেরগুলি স্ট্রিংয়ের সমস্ত 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
}

আরও দেখুন:

সাইডনোটে: আমি নিশ্চিত যে এটি একটি সদৃশ এবং আপনি উত্তরটি কোথাও কোথাও খুঁজে পেতে পারেন


এইচটিএমএল নিয়মিত ভাষা না হওয়ায় এইচটিএমএল পার্স করার জন্য নির্ভরযোগ্য রেজেক্স সহজাত অসম্ভব।
Asciiom

19

আমি গর্ডনের সাথে একমত, আপনি HTML পার্স করার জন্য একটি HTML পার্সার ব্যবহার করা উচিত use তবে আপনি যদি সত্যিই একটি রেজেক্স চান তবে আপনি এটি ব্যবহার করে দেখতে পারেন:

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

কেবল তথ্যের জন্য: আমরা যদি অভিব্যক্তি (। *?) এর চেয়ে অনেকগুলি
উপাদানযুক্ত

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]}
Ignacio Bustos

3

যিনি এখনও সিম্পলএক্সএমএল ব্যবহার করে খুব সহজে এবং দ্রুত সমাধানগুলি পান না তার জন্য

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

এটা আমার জন্য কাজ করে


2

আপনি এখানে যা করার চেষ্টা করছেন তা আমি নিশ্চিত নই, তবে আপনি যদি লিঙ্কটি যাচাই করার চেষ্টা করছেন তবে পিএইচপি-র ফিল্টার_ভার () দেখুন

আপনার যদি সত্যিই কোনও নিয়মিত ভাব প্রকাশের প্রয়োজন হয় তবে এই সরঞ্জামটি দেখুন, এটি সহায়তা করতে পারে: http://regex.laysolavtorvik.com/


2

আপনার রেজেক্স ব্যবহার করে, আমি আপনার প্রয়োজন অনুসারে এটি কিছুটা সংশোধন করেছি।

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

আমি ব্যক্তিগতভাবে আপনাকে এইচটিএমএল পার্সার ব্যবহার করার পরামর্শ দিই

সম্পাদনা: পরীক্ষিত


myregextester.com ব্যবহার করে - দুঃখিত, লিঙ্কগুলি খুঁজে পাচ্ছেন না
বার্গিন

এটি বলে: কোনও ম্যাচ নেই। DELIMITER সমাপ্তির জন্য চেক করুন।
বার্গিন

আপনি আমাকে মেলে পাঠ্য বলতে পারেন? আমি ব্যবহার করি:<a title="this" href="that">what?</a>
রুয়েল

1

দ্রুত পরীক্ষা: <a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a> প্রথম কৌশলটি "বা 'এর সাথে, দ্বিতীয়টি' হেরেফ 'মান' যে 'এবং' তৃতীয়টি 'কী?' রয়েছে বলে মনে হচ্ছে কৌতুকটি করছে।

"/ 'এর প্রথম ম্যাচটি সেখানে রেখেছিলাম কারণ আপনি এটি" /' বন্ধের জন্য পরে এটির পিছনে উল্লেখ করতে ব্যবহার করতে পারেন তাই এটি একই।

লাইভ উদাহরণ দেখুন: http://www.rubular.com/r/jsKyK2b6do এ


1
@ বার্জিন দয়া করে নির্দিষ্ট করুন, কী কাজ করে না? আমি আপনার পরীক্ষার এইচটিএমএলতে href থেকে সঠিক মান পাই value আপনি কী আশা করছেন যে এটি করে না? আমি আপনাকে পরীক্ষার জন্য একটি পৃথক সাইট ব্যবহার করতে দেখছি, সেখানে আমি আপনার উদাহরণ থেকে সফলভাবে 'হ্রেফ' মানও পাই। myregextester.com/?r=d966dd6b
CharlesLeaf

0

preg_match_all ("/ (] >) " (। ?) (</ a) /", $ বিষয়বস্তু, $ ইমপ্যাচগুলি, PREG_SET_ORDER);

এটি পরীক্ষা করা হয় এবং এটি কোনও এইচটিএমএল কোড থেকে সমস্ত ট্যাগ আনে।


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এখন ব্যবহার করা সহজ যে এসোসিয়েটিভ সাব-অ্যারে রয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.