2012-04-22 15 views
12

Actualmente estoy haciendo una búsqueda de xpath, la búsqueda está funcionando pero necesito que sea insensible a las mayúsculas y minúsculas. El archivo xml que estoy usando es 1.0, que de mi investigación significa que tengo que usar algo llamado función de traducción, pero no estoy seguro de cómo hacerlo.¿Cómo hago que la búsqueda de Xpath sea insensible?

Aquí está mi archivo de búsqueda:

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

Cualquier ayuda sería muy apreciada, gracias.

+0

@ alain.janinm: La respuesta actualmente aceptada es incorrecta - vea mi respuesta para obtener una explicación y para las expresiones correctas de XPath 1.0 y XPath 2.0. –

Respuesta

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

Tanto reemplazar todo caso superior a minúsculas.

3

La respuesta aceptada actualmente es defectuoso - porque nada garantiza que el segundo argumento de ya se convierte a minúsculas.

Además, se utiliza '$search' - y esto es literalmente la cadena "$search" - no es la variable de $search.

Aquí es una solución correcta:

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

El XPath correspondiente 2,0 expresión:

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

actualización:

Basado en esta solución, @alain.janinm ha corregido su responder.

+0

+1 tienes razón, pensé que la segunda parte siempre estaba en minúsculas. –

+0

@ alain.janinm: De nada. –

+0

es un poco tonto hacer la traducción() en $ txtSearch, cuando simplemente puede pasar strtolower ($ txtSearch) ... –

3

Técnicamente, para hacer una comparación de casos ciegos, debe usar una intercalación de casos ciegos, a menos que su texto sea inglés; normalizar ambos operandos a mayúsculas o minúsculas no da el resultado correcto en todas las circunstancias. Lamentablemente, los nombres de intercalación (en XPath 2.0) no están estandarizados, por lo que debe buscar en la documentación de su producto para ver qué intercalaciones están disponibles.

0

Una búsqueda que ignore puede ser mediante el uso de la función matches al igual que

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

la sección //string[text() [matches(.,'^OK$','i')]] de la consulta utiliza expresiones regulares (Regex) para determinar un partido.

Cuestiones relacionadas