2012-04-22 13 views
12

Attualmente sto facendo una ricerca xpath, ho la ricerca funzionante ma ho bisogno di renderla insensibile alle maiuscole/minuscole. Il file xml che sto usando è 1.0, che dalla mia ricerca significa che devo usare qualche cosa chiamata funzione di traduzione, ma non sono sicuro di come farlo.Come faccio a rendere Xpath la ricerca senza distinzione tra maiuscole e minuscole

Ecco il mio file di ricerca:

$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>"; 

Qualsiasi aiuto sarebbe molto apprezzato, grazie.

+0

@ alain.janinm: la risposta attualmente accettata non è corretta: consultare la risposta per le spiegazioni e per le espressioni XPath 1.0 e XPath 2.0 corrette. –

risposta

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)]" 

Sia sostituire lettere maiuscole a lettere minuscole.

3

La risposta attualmente accettata è errata, poiché nulla garantisce che il secondo argomento di sia già stato convertito in minuscolo.

Inoltre, utilizza '$search' - e questo è letteralmente la stringa "$search" - non il variabile$search.

Ecco una soluzione corretta:

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

Il corrispondente XPath 2.0 espressione:

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

Aggiornamento:

Sulla base di questa soluzione, @alain.janinm ha corretto il suo risposta.

+0

+1 hai ragione, ho pensato che la seconda parte fosse sempre in minuscolo. –

+0

@ alain.janinm: prego. –

+0

è un po 'sciocco fare il translate() su $ txtSearch, quando puoi semplicemente passare strtolower ($ txtSearch) ... –

3

Tecnicamente, per eseguire un confronto tra maiuscole e minuscole, è necessario utilizzare un confronto tra maiuscole e minuscole, a meno che il testo non sia inglese; normalizzare entrambi gli operandi in maiuscolo o in minuscolo non fornisce il risultato corretto in tutte le circostanze. Sfortunatamente i nomi delle regole di confronto (in XPath 2.0) non sono standardizzati, quindi è necessario consultare la documentazione del prodotto per vedere quali regole sono disponibili.

0

Un caso ricerca maiuscole può essere utilizzando utilizzando la funzione matches in questo modo

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

sezione //string[text() [matches(.,'^OK$','i')]] della query utilizza espressioni regolari (regex) per determinare una corrispondenza.

Problemi correlati