2012-04-22 13 views
12

मैं वर्तमान में एक एक्सपैथ खोज कर रहा हूं, मुझे खोज मिल रही है लेकिन मुझे इसे असंवेदनशील बनाने की आवश्यकता है। मैं जिस एक्सएमएल फाइल का उपयोग कर रहा हूं वह 1.0 है जो मेरे शोध से है कि मुझे अनुवाद समारोह नामक कुछ चीज़ों का उपयोग करना है, लेकिन मुझे यह सुनिश्चित करने के बारे में अनिश्चितता है कि यह कैसे करें।मैं एक्सपैथ खोज केस असंवेदनशील कैसे बना सकता हूं

$holidayDoc = simplexml_load_file('holidays.xml');  

// fetch data from form 
$txtSearch = $_GET['txtSearch']; 

$qry = "//channel/item[contains(.,\"$txtSearch\")]"; 


$holidays = $holidayDoc->xpath($qry); // do the xpath query 
// now loop through all the students 

echo "Showing title search results for $txtSearch"; 

foreach ($holidays as $holiday) 
{ 

echo "<p><a href=\"{$holiday->link}\">{$holiday->title}</a></p> 
    <p><small>$holiday->pubDate</small></p>"; 

किसी भी मदद की बहुत धन्यवाद की सराहना की जाएगी:

यहाँ मेरी खोज फ़ाइल है।

+0

@ alain.janinm: वर्तमान में स्वीकृत उत्तर गलत है - स्पष्टीकरण के लिए और सही XPath 1.0 और XPath 2.0 अभिव्यक्तियों के लिए मेरा उत्तर देखें। –

उत्तर

18

XPath 1.0:

$qry = "//channel/item[contains(
translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), 
translate($search, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]" 

XPath 2.0:

$qry = "//channel/item[lower-case(.) = lower-case($search)]" 

दोनों के सभी अक्षर को लोअर केस में बदलें।

3

वर्तमान में स्वीकृत उत्तर त्रुटिपूर्ण है - क्योंकि कुछ भी गारंटी नहीं देता है कि का दूसरा तर्क पहले से ही कम मामले में परिवर्तित हो गया है।

इसके अलावा, यह '$search' उपयोग करता है - और यह सचमुच स्ट्रिंग "$search" है - नहीं चर$search

//channel/item 
    [contains(translate(., 
         'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
         'abcdefghjiklmnopqrstuvwxyz'), 
      translate($txtSearch, 
         'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
         'abcdefghjiklmnopqrstuvwxyz') 
      ) 
    ] 

इसी XPath 2.0 अभिव्यक्ति:

//channel/item[contains(lower-case(.), lower-case($txtSearch))] 

अद्यतन:

यहाँ एक सही समाधान है

इस समाधान के आधार पर, @alain.janinm सुधारा गया है उनके जवाब।

+0

+1 आप सही हैं मैंने सोचा है कि दूसरा हिस्सा हमेशा कम मामले में था। –

+0

@ alain.janinm: आपका स्वागत है। –

+0

यह $ txtSearch पर अनुवाद() करने के लिए थोड़ा मूर्ख है, जब आप आसानी से strtolower ($ txtSearch) पास कर सकते हैं ... –

3

तकनीकी रूप से, केस-अंधा तुलना करने के लिए आपको केस-अंधा संयोजन का उपयोग करना चाहिए, जब तक कि आपका टेक्स्ट अंग्रेजी न हो; दोनों ऑपरेशंस को ऊपरी मामले या कम मामले में सामान्य करने से सभी परिस्थितियों में सही परिणाम नहीं मिलता है। दुर्भाग्यवश संयोजन नाम (XPath 2.0 में) मानकीकृत नहीं हैं, इसलिए आपको यह देखने के लिए अपने उत्पाद प्रलेखन को देखना होगा कि कौन से संयोजन उपलब्ध हैं।

0

एक केस संवेदी खोज matches समारोह की तरह तो

$qry = "//string[text() [matches(.,'^stringImTryingToFind$','i')]]" 

क्वेरी की //string[text() [matches(.,'^OK$','i')]] अनुभाग रेगुलर एक्सप्रेशन (RegEx) का उपयोग करता है का उपयोग करते हुए एक मैच निर्धारित करने के लिए उपयोग कर रहा हो सकता है।

संबंधित मुद्दे