Nasıl bir harf duyarsız arama gerçekleştirmek ve non-İngilizce karakterleri desteklemek için XPath'i kullanabilirsiniz?

4 Cevap php

Ben aşağıdaki kodu kullanarak, bir XML dosyasında bir arama yapıyorum:

$result = $xml->xpath("//StopPoint[contains(StopName, '$query')]");

$ Sorgu arama sorgusu ve StopName bir otobüs durağının adıdır. Sorun bu harf duyarlı olduğunu.

Ve sadece bu değil, ben de Norveç adlarını iade etme ÆØÅæøå gibi olmayan-İngilizce karakterleri ile arama yapmak mümkün olacaktır.

Bu nasıl mümkün olur?

4 Cevap

XPath 1.0 (ben inanıyorum, PHP SimpleXML ile alabilirsiniz en iyi olan), karışık durum girişten tüm küçük çıkış üretmek için translate() fonksiyonunu kullanmak zorunda.

Kolaylık sağlamak için, ben böyle bir fonksiyon içine olur:

function findStopPointByName($xml, $query) {
  $upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"; // add any characters...
  $lower = "abcdefghijklmnopqrstuvwxyzæøå"; // ...that are missing

  $arg_stopname = "translate(StopName, '$upper', '$lower')";
  $arg_query    = "translate('$query', '$upper', '$lower')";

  return $xml->xpath("//StopPoint[contains($arg_stopname, $arg_query)");
}

Göz ardı edilir eğer XPath dize kıracak çünkü bir dezenfekte önlemi olarak ben tamamen yasaklamak veya $query tek tırnak kaçmak olurdu ya.

Olmayan İngilizce adları bir problem olmamalı. Sadece XPath'ın ekleyebilirsiniz. (XML Unicode kullanılması olarak tanımlanmaktadır).

Küçük harf farkı gelince, ...

XPath 1.0 aşağıdakileri içerir statement:

İki dizeleri onlar UCS karakterleri aynı sırayla oluşur ancak ve ancak eşittir.

Bu yüzden bile yerel adı açık yüklemler kullanarak yardımcı olmayacaktır.

XPath 2 davayı haritasına fonksiyonları içerir. Örneğin fn:upper-case


Ek: function çevirmek XPath bulunuyor kullanarak örnek haritalama XPath 1 sahte olduğu, ancak giriş sizin ve kullanıcıların hiç ihtiyacınız olacak her kasalı kod noktası eklemek gerekir izin vermelidir:

"test" = translate($inputString, "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ")

Buna ek olarak:

$ Xml-> xpath ("/ / StopPoint [(StopName, '$ sorgu') içerir]");

Size ifade kesmemek için $ sorgudan kesme karakterleri şerit gerekir.

XPath 2.0 Eğer bir dize içine alıntı koymak için sınırlayıcı olarak kullanılan alıntı-yukarı iki katına çıkarabilir, ancak XPath 1.0 o dize sınırlayıcı dahil etmek imkansız.