এক্সপথ সহ সিএসএস শ্রেণি নির্বাচন করা


87

আমি নিজের নামে ডেটে ডেটে কেবল একটি শ্রেণি নির্বাচন করতে চাই

কিছু কারণে, আমি এটি কাজ করতে পারি না। কেউ যদি আমার কোডটিতে ভুল বুঝতে পারে তবে এটির অনেক প্রশংসা হবে।

@$doc = new DOMDocument();
@$doc->loadHTML($html);
$xml = simplexml_import_dom($doc); // just to make xpath more simple
$images = $xml->xpath('//[@class="date"]');                             
foreach ($images as $img)
{
    echo  $img." ";
}

4
এবং এইচটিএমএল টুকরা সম্পর্কে কি? (এক্সপথের নিকটবর্তী হওয়ায় আমাদেরকে এক্সএক্সএমএল () থেকে সিম্পল এক্সএমএল আউটপুট দেখাতে পছন্দ করুন)
সার্জস

যদি আপনার একাধিক ক্লাস করতে হয়contains(@class, 'date')
গর্ডন



@ গর্ডনের উত্তর বিপজ্জনক, যদি শ্রেণীর বৈশিষ্ট্যটি "ডেটটাইম" হয় তবে এটিও মিলবে। user716736 এর উত্তর আরও সম্পূর্ণ।
নীলস বম

উত্তর:


242

আমি এই প্রশ্নের ক্যানোনিকাল উত্তর লিখতে চাই কারণ উপরের উত্তরটিতে একটি সমস্যা আছে।

আমাদের সমস্যা

সিএসএস নির্বাচক:

.foo

ক্লাস ফুও রয়েছে এমন কোনও উপাদান নির্বাচন করবে ।

এক্সপ্যাটে আপনি কীভাবে এটি করেন?

যদিও এক্সপ্যাথ সিএসএসের চেয়ে বেশি শক্তিশালী, এক্সপ্যাথের কোনও সিএসএস শ্রেণি নির্বাচকের নেটিভ সমতুল্য নেই । তবে এর সমাধানও রয়েছে।

এটি করার সঠিক উপায়

এক্সপ্যাটে সমতুল্য নির্বাচক হলেন:

//*[contains(concat(" ", normalize-space(@class), " "), " foo ")]

ফাংশনটি নরমালাইজ-স্পেস স্ট্রিপগুলি শীর্ষস্থানীয় এবং সাদা সাদা জায়গার পিছনে ফেলে দেয় (এবং একক স্থানের দ্বারা সাদা স্থানের অক্ষরের ক্রমগুলিও প্রতিস্থাপন করে)।

(আরও সাধারণ অর্থে) এটি সিএসএস নির্বাচকের সমতুল্য:

*[class~="foo"]

যা শ্রেণীর বৈশিষ্ট্যের মান হ'ল স্পেস-বিভাজিত মানগুলির তালিকা হিসাবে এমন কোনও উপাদানের সাথে মিলবে , যার একটি হুবহু foo এর সমান ।

এটি করার কয়েকটি সুস্পষ্ট, তবে ভুল উপায়

এক্সপ্যাথ নির্বাচক:

//*[@class="foo"]

কাজ করে না! কারণ এটি এমন কোনও উপাদানের সাথে মেলে না যেটির একাধিক শ্রেণি রয়েছে, উদাহরণস্বরূপ

<div class="foo bar">

শ্রেণীর নামের আশেপাশে কোনও অতিরিক্ত সাদা জায়গা থাকলেও এটি মেলে না:

<div class="  foo ">

'উন্নত' এক্সপ্যাথ নির্বাচক

//*[contains(@class, "foo")]

কাজ করে না! কারণ এটি ভুলভাবে বর্গ উপাদানের সাথে মিলে যায় FOOBAR , উদাহরণস্বরূপ

<div class="foobar">

ক্রেডিট এই ফেল্লার কাছে যায়, যিনি আমি ওয়েবে এই সমস্যাটির প্রথম প্রকাশিত সমাধান পেয়েছি: http://dubinko.info/blog/2007/10/01/simple-parsing-of-space-seprated-attributes- ইন-এক্সপাথেক্স্লট /


স্থান স্বাভাবিক করার দরকার কী?
ফ্রিক

"উপরের উত্তর" সম্ভবত মিঃগ্লাসকে বোঝায়।
লার্শ

এটা কি সম্ভব <div class="foo\tbar">? মানে, ক্লাসের নামগুলি একটি ট্যাব দ্বারা পৃথক করা।
হিমশীতল শিখা

4
তবে <ডি ক্লাস = "গ্রুপ-কন্ডিশন" /> এবং <ডি ক্লাস = "শর্ত" /> $ এক্স ('// ডিভাইড [(কনক্যাট ("", নরমালাইজ-স্পেস (@ ক্লাস)), " ")," শর্ত ")] ')
মেমকে

4
@ testerjoe2 আপনি কি চেষ্টা করেছেন //*[contains(concat(" ", normalize-space(@class), " "), " foo ")]?
নীলস বম

11

//[@class="date"] একটি বৈধ এক্সপথ নয়।

চেষ্টা করুন //*[@class="date"], বা যদি আপনি জানেন এটি একটি চিত্র,//img[@class="date"]


7

এক্সপথ ৩.১ একটি ফাংশনটি টোকেনের সাথে পরিচয় করিয়ে দেয় এবং অবশেষে এইটিকে 'সরকারীভাবে' সমাধান করে। এটি ক্লাস সমর্থন করার জন্য ডিজাইন করা হয়েছে ।

উদাহরণ:

//*[contains-token(@class, "foo")]

এই ফাংশনটি নিশ্চিত করে যে সাদা স্থান (কেবলমাত্র (ইউ + 0020)) সঠিকভাবে পরিচালনা করা হয়নি, শ্রেণীর নামের পুনরাবৃত্তির ক্ষেত্রে কাজ করে এবং সাধারণত প্রান্তের কেসগুলি কভার করে।


দ্রষ্টব্য: আজ (2016-12-13) হিসাবে এক্সপথ ৩.১ এর প্রার্থী সুপারিশের স্থিতি রয়েছে ।


এটি আজকের সর্বশেষ ক্রোমে কাজ করে না। যতক্ষণ না এটি কার্যকর হয়, ততক্ষণ আমরা কীভাবে সীমাবদ্ধতাটি পেয়ে যাব যে // * [এতে (@ ক্লাস, "foo") রয়েছে] foo, যথা fooz ইত্যাদির মতো যে কোনও শ্রেণিকেও নির্বাচন করবে
মাস্টারজয়ে

3

এক্সপ্যাথ ২.০ এ আপনি করতে পারেন:

//*[count(index-of(tokenize(@class, '\s+' ), 'foo')) = 1]

খ্রিস্টান উইস্কের বিবৃতি অনুসারে: https://cweiske.de/tagebuch/XPath%3A%20Stelect%20element%20by%20class.htm


দুর্ভাগ্যক্রমে 6/12/2017 হিসাবে এটি ক্রোমের দ্বারা প্রয়োগ করা হবে বলে মনে হচ্ছে না। en.wikedia.org/wiki/… এর উপর ভিত্তি করে মনে হচ্ছে এটি বোর্ড জুড়ে বেশ কিছুটা
কমছে

1

এইচটিএমএল কেস-সংবেদনশীল উপাদান এবং বৈশিষ্ট্যর নামগুলিকে অনুমতি দেয় এবং তারপরে শ্রেণি শ্রেণি-নামের তালিকা থেকে পৃথক করা তালিকা। এখানে আমরা একটি imgট্যাগ এবং classনাম জন্য যান date:

//*['IMG' = translate(name(.), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')]/@*['CLASS' = translate(name(.), 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') and contains(concat(' ', normalize-space(.), ' '), concat(' ', 'date', ' '))]

এছাড়াও দেখুন: সিএসএস নির্বাচক থেকে এক্সপাথ রূপান্তর


1

নমুনা সাইন সাবধানে সাবধান !!! আপনি যদি ডিওমে "আমার নিজস্বক্লাস" অনুসন্ধান করছেন:

<ul class="my-ownclass"><li>...</li></ul>
<ul class="someother"><li>...</li></ul>
<ul><li>...</li></ul>

$finder = new DomXPath($dom);
$nodes = $finder->query(".//ul[contains(@class, 'my-ownclass')]"); // This will NOT behave as expected! This will strangely match all the <ul> elements in DOM.
$nodes = $finder->query(".//ul[contains(@class, 'ownclass')]"); // This will match the element.
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.