जवाबों:
यह XPath 1.0 के लिए है। यदि आपका वातावरण XPath 2.0 का समर्थन करता है, तो यहां देखें ।
हाँ। संभव है, लेकिन सुंदर नहीं।
/html/body//text()[
contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),
'test'
)
]
यह उन खोज तारों के लिए काम करेगा जहाँ वर्णमाला पहले से जानी जाती है। आपके द्वारा देखे जाने वाले किसी भी उच्चारण वर्ण को जोड़ें।
यदि आप कर सकते हैं, तो उस पाठ को चिह्नित करें जो आपको किसी अन्य माध्यम से रुचिकर बनाता है, जैसे <span>
कि HTML बनाने के दौरान इसमें एक निश्चित वर्ग होता है। इस तरह की चीजों को तत्व पाठ में सब्सट्रिंग्स की तुलना में एक्सपीथ के साथ पता लगाना बहुत आसान है।
यदि यह विकल्प नहीं है, तो आप जावास्क्रिप्ट (या किसी अन्य होस्ट भाषा का उपयोग कर सकते हैं जिसे आप XPath निष्पादित करने के लिए उपयोग कर रहे हैं) आपको एक गतिशील XPath अभिव्यक्ति बनाने में मदद कर सकती है:
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')]"
(Hat टिप @ KirillPolenchuk के उत्तर के लिए - निश्चित रूप से आपको केवल उन पात्रों का अनुवाद करना होगा जिन्हें आप वास्तव में खोज रहे हैं )।
यह दृष्टिकोण वर्णमाला के पूर्व ज्ञान की आवश्यकता के बिना किसी भी खोज स्ट्रिंग के लिए काम करेगा, जो कि एक बड़ा प्लस है।
ऊपर दिए गए दोनों तरीके विफल हो जाते हैं जब खोज के तार एकल उद्धरण शामिल हो सकते हैं, जिस स्थिति में चीजें अधिक जटिल हो जाती हैं ।
translate()
अपने आप को परवाह नहीं है कि आप कितनी बार प्रत्येक चरित्र को दोहराते हैं - translate(., 'EE', 'ee')
बिल्कुल बराबर है translate(., 'E', 'e')
। पुनश्च: @KirillPolenchuk को मत देना, विचार था उसका।
अधिक सुंदर:
/html/body//text()[contains(translate(., 'TES', 'tes'), 'test')]
TEST
है test
और Test
जैसा है वैसा ही रह जाता है?
translate(., 'TES', 'tes')
। इस तरह से लोगों को एहसास होगा कि यह एक शब्द अनुवाद नहीं है, कि यह एक पत्र अनुवाद है।
लो-केस () का प्रयोग करें :
/html/body//text()[contains(lower-case(.),'test')]
मैचों का उपयोग करें () अपने केस-असंवेदनशील झंडे के साथ रेगेक्स मिलान:
/html/body//text()[matches(.,'test', 'i')]
यदि आप XPath 2.0 का उपयोग कर रहे हैं, तो आप किसी कॉलेशन को तीसरे तर्क के रूप में निर्दिष्ट कर सकते हैं ()। हालाँकि, कोलाज यूआरआई को मानकीकृत नहीं किया जाता है, इसलिए विवरण उस उत्पाद पर निर्भर करता है जिसका आप उपयोग कर रहे हैं।
ध्यान दें कि अनुवाद () का उपयोग करके पहले दिए गए समाधान सभी मानते हैं कि आप केवल 26-अक्षर वाले अंग्रेजी वर्णमाला का उपयोग कर रहे हैं।
अद्यतन: XPath 3.1 केस-अंधी मिलान के लिए एक मानक टकराव URI को परिभाषित करता है।
XPath में "ट्रांसलेट" फ़ंक्शन का उपयोग करके मैंने हमेशा ऐसा किया। मैं इसके बहुत सुंदर नहीं कहूँगा, लेकिन यह सही ढंग से काम करता है।
/html/body//text()[contains(translate(.,'abcdefghijklmnopqrstuvwxyz',
'ABCDEFGHIJKLOMNOPQRSTUVWXYZ'),'TEST')]
उम्मीद है की यह मदद करेगा,