কেস সংবেদনশীল এক্সপথে রয়েছে () সম্ভব?


94

আমি আমার ডিওএম এর সমস্ত পাঠ্য নোডের উপর দিয়ে যাচ্ছি এবং নোডভ্যালুতে একটি নির্দিষ্ট স্ট্রিং রয়েছে কিনা তা পরীক্ষা করে দেখছি।

/html/body//text()[contains(.,'test')]

এটি কেস সেনসিটিভ। তবে আমিও ধরতে চাই Test, TESTবা TesT। এক্সপাথ (জাভাস্ক্রিপ্টে) দিয়ে কি এটি সম্ভব?

উত্তর:


112

এটি এক্সপথ 1.0 এর জন্য। যদি আপনার পরিবেশ এক্সপথ ২.০ সমর্থন করে তবে এখানে দেখুন


হ্যাঁ. সম্ভব, তবে সুন্দর নয়।

/html/body//text()[
  contains(
    translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
    'test'
  )
]

এটি অনুসন্ধানের স্ট্রিংয়ের জন্য কাজ করবে যেখানে বর্ণমালা আগে থেকেই পরিচিত। আপনি প্রত্যাশিত যে কোনও বর্ণিত অক্ষর যুক্ত করুন।


যদি আপনি পারেন তবে পাঠ্যটি চিহ্নিত করুন যা আপনার আগ্রহের সাথে অন্য কোনও মাধ্যম যেমন এটিএমএলটি <span>তৈরির সময় নির্দিষ্ট শ্রেণিযুক্ত একটিতে এটি বন্ধ করে দেওয়া । উপাদান পাঠ্যের সাবস্ট্রিংয়ের চেয়ে এক্সপথ দিয়ে এই জাতীয় জিনিসগুলি সনাক্ত করা অনেক সহজ।

যদি এটি কোনও বিকল্প না হয় তবে আপনি জাভাস্ক্রিপ্ট (বা অন্য কোনও হোস্ট ভাষা যা আপনি এক্সপাথ চালাতে ব্যবহার করছেন) আপনাকে গতিশীল এক্সপাথ এক্সপ্রেশন তৈরি করতে সহায়তা করতে পারেন:

function xpathPrepare(xpath, searchString) {
  return xpath.replace("$u", searchString.toUpperCase())
              .replace("$l", searchString.toLowerCase())
              .replace("$s", searchString.toLowerCase());
}

xp = xpathPrepare("//text()[contains(translate(., '$u', '$l'), '$s')]", "Test");
// -> "//text()[contains(translate(., 'TEST', 'test'), 'test')]"

( @ ক্যারিলপলিশচুকের উত্তরের টুপি - অবশ্যই আপনি কেবল সেই অক্ষরগুলি অনুবাদ করতে হবে যা আপনি প্রকৃতপক্ষে অনুসন্ধান করছেন))

এই পদ্ধতির বর্ণমালার পূর্ব জ্ঞানের প্রয়োজন ছাড়াই যে কোনও অনুসন্ধানের স্ট্রিংয়ের জন্য কাজ করবে, এটি একটি বড় প্লাস।

উপরের দুটি পদ্ধতিই ব্যর্থ হয় যখন অনুসন্ধানের স্ট্রিংগুলিতে একক উদ্ধৃতি থাকতে পারে, সেক্ষেত্রে জিনিসগুলি আরও জটিল হয়


ধন্যবাদ! এছাড়াও সংযোজনটি দুর্দান্ত, কেবলমাত্র প্রয়োজনীয় অক্ষর অনুবাদ করে। পারফরম্যান্স জয়ের কী তা আমি কৌতূহলী হয়েছি। নোট করুন যে xpathPrepare () একবারে একাধিক প্রদর্শিত চরগুলি আলাদাভাবে পরিচালনা করতে পারে (যেমন আপনি TEEEEEST এবং teieeest পান) get
অ্যারন বুস্ট

@ অরনউউস্ট: ঠিক আছে, কিছুটা লাভ হতে পারে, যদি আপনি এটির জন্য আগ্রহী হন তবে এটি বেনমার্ক করুন। translate()আপনি প্রতিটি চরিত্রকে কতবার পুনরাবৃত্তি করেন তা নিজেই যত্ন করে না - translate(., 'EE', 'ee')এটি একেবারে সমতুল্য translate(., 'E', 'e')পিএস: @ কিরিলপলিশচুক-আপ আপ করতে ভুলবেন না, ধারণাটি তাঁর ছিল।
তোমালাক

4
System.XML.XMLNodeList x = mydoc.SelectNodes ("// * [এতে (অনুবাদ (পাঠ্য (), 'ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜÉÈÊÀÁÂÒÓÔÙÚÛÇÅÏÕÑŒ', 'abcdefghijklmnopqrstuvwxyzäöüéèêàáâòóôùúûçåïõñœ'), 'foo')])));
স্টিফান স্টেইগার

4
না। দেখুন "অবশ্যই আপনাকে কেবল সেই অংশগুলিই অনুবাদ করতে হবে যা আপনি প্রকৃতপক্ষে অনুসন্ধান করছেন" অংশটি।
তোমালাক

62

আরো সুন্দর:

/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]

4
+1 একেবারে। এটাই আমি ভাবিনি think (আমি আমার উত্তরে এটি ব্যবহার করব, এটি আমি লিখেছে মূল জাভাস্ক্রিপ্ট রুটিনের চেয়ে অনেক ভাল)
টমলক

4
এটি কি রূপান্তর TESTকরে testএবং ঠিক Testযেমনটি ছেড়ে দেবে না ?
মুহাম্মদ আদিল জাহিদ

7
@ মুহাম্মাদআদিলজাহিদ - না, এটি "টি" কে "টি", "ই" "ই" দিয়ে প্রতিস্থাপন করছে। এটি 1-থেকে -1 ম্যাচ।
ড্যানিয়েল হ্যালি

এটি করা আরও পরিষ্কার হতে পারে translate(., 'TES', 'tes')। লোকেরা বুঝতে পারবে যে এটি কোনও শব্দের অনুবাদ নয়, এটি একটি চিঠির অনুবাদ।
mlissner

বা 'ইএসটি,' ইস্ট ', যদিও এটি দেখতে দুর্দান্ত লাগছে (যদিও কিছুটা ক্রিপ্টিক) অনুসন্ধানের শব্দটির অংশটি ম্যাপিংয়ে প্রদর্শিত হচ্ছে (পুনরাবৃত্ত অক্ষরগুলি সরানো হয়েছে)
জর্জ বীরবিলিস

56

এক্সপথ ২.০ সমাধান

  1. লোয়ার-কেস () ব্যবহার করুন :

    /html/body//text()[contains(lower-case(.),'test')]

  2. এর কেস-সংবেদনশীল পতাকার সাথে ম্যাচগুলি () রিজেক্স ম্যাচ ব্যবহার করুন :

    /html/body//text()[matches(.,'test', 'i')]


4
এই সিনট্যাক্সটি ফায়ারফক্স এবং ক্রোমে সমর্থিত নয়? আমি এটি কেবল কনসোলে চেষ্টা করেছি এবং তারা উভয়ই সিনট্যাক্স ত্রুটি করে।
ডিবি

4
ফায়ারফক্স এবং ক্রোম কেবল এক্সপথ 1.0 প্রয়োগ করে।
kjhughes

আমি কোথায় যাচাই করতে পারি যে এটি প্রত্যাশার মতো কাজ করবে?
অঙ্কিত গুপ্তা

@ অঙ্কিতগুপ্ত: এক্সপ্যাথ ২.০ সমর্থন করে এমন যে কোনও অনলাইন বা অফলাইন সরঞ্জাম অবশ্যই এই উত্তরটি যাচাই করতে ব্যবহার করা যেতে পারে, তবে (1) সরঞ্জামের সুপারিশগুলি এখানে এসও এবং (2) 56-টি upvotes, 0 ডাউনভোটস এবং না হিসাবে দেওয়া হয়েছে ছয় বছরেরও বেশি সময়ে মতবিরোধমূলক মন্তব্যগুলি, আপনি যথেষ্ট আত্মবিশ্বাসের সাথে বলতে পারেন যে এই উত্তরটি সঠিক। ;-)
kjhughes

8

হ্যাঁ. আপনি translateযে পাঠ্যটি মেলে দেখতে চান তা নিম্নের ক্ষেত্রে রূপান্তর করতে ব্যবহার করতে পারেন :

/html/body//text()[contains(translate(., 
                                      'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
                                      'abcdefghijklmnopqrstuvwxyz'),
                   'test')]

6

আপনি যদি এক্সপথ ২.০ ব্যবহার করছেন তবে আপনি () যুক্ত থাকা তৃতীয় আর্গুমেন্ট হিসাবে কোনও কোলেশন নির্দিষ্ট করতে পারেন। তবে কোলেশন ইউআরআই মানসম্মত নয় তাই বিশদগুলি আপনি যে পণ্যটি ব্যবহার করছেন তার উপর নির্ভর করে।

নোট করুন যে অনুবাদগুলি () ব্যবহার করে এর আগে প্রদত্ত সমাধানগুলি সমস্ত ধরে নেয় যে আপনি কেবল 26-অক্ষরের ইংরেজি বর্ণমালা ব্যবহার করছেন।

আপডেট: এক্সপথ ৩.১ কেস-ব্লাইন্ড মিলে যাওয়ার জন্য একটি স্ট্যান্ডার্ড কোলেশন ইউআরআই সংজ্ঞায়িত করে।


3

এক্সপ্যাথটিতে "অনুবাদ" ফাংশনটি ব্যবহার করে আমি যেভাবে সর্বদা এটি করেছি। আমি এটি খুব সুন্দর বলব না তবে এটি সঠিকভাবে কাজ করে।

/html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz',
                                        'ABCDEFGHIJKLOMNOPQRSTUVWXYZ'),'TEST')]

আশাকরি এটা সাহায্য করবে,

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