Wie kann ich den XPath verwenden, um führen Sie eine case-insensitive-Suche und die Unterstützung von nicht-englischen Zeichen?
Ich bin der Durchführung einer Suche in einer XML-Datei, mit dem folgenden code:
$result = $xml->xpath("//StopPoint[contains(StopName, '$query')]");
Wobei $query der Suchanfrage, Sie StopName ist der name einer Bushaltestelle. Das problem ist, es ist groß-und Kleinschreibung.
Und nicht nur das, ich wäre auch in der Lage sein, um die Suche mit nicht-englischen Zeichen wie ÆØÅæøå zurück Norwegische Namen.
Wie ist das möglich?
- Für diejenigen, die auf der Suche nach einer Lösung für dieses problem, hier ist ein Artikel, der beschreibt einen alternativen Ansatz: codingexplained.com/coding/php/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
In XPath 1.0 (das ist, glaube ich, das beste, was man mit PHP SimpleXML), möchten Sie verwenden, die
translate()
Funktion zu produzieren, die all-lowercase-Ausgabe von mixed-case-Eingabe.Für die Bequemlichkeit, würde ich wickeln Sie es in eine Funktion wie diese:
Als Desinfektions-Maßnahme würde ich entweder komplett verbieten oder escape-Anführungszeichen in
$query
, weil Sie Ihre Pause XPath-string, wenn Sie ignoriert werden.In XPath 2.0 können Sie
Kleinbuchstaben()
- Funktion, die unicode-bewußt, so werde es behandeln, die nicht-ASCII-Zeichen in Ordnung.Zugriff auf XPath 2.0 müssen Sie die XSLT 2.0-parser. Zum Beispiel SÄCHSISCHE. Sie können es von PHP über JavaBridge.
Nicht-englische Namen sollten kein problem sein. Fügen Sie Sie einfach auf Ihrem XPath. (XML ist definiert als die Verwendung von Unicode).
Als für Fall-Gefühllosigkeit, ...
XPath 1.0 umfasst die folgenden Anweisung:
Also auch explizite Prädikate auf der " local-name wird nicht helfen.
XPath 2 enthält Funktionen zum anzeigen Fall. E. g. fn:upper-case
Zusätzliche Informationen: die Verwendung von XPath-translate-Funktion ermöglichen sollte, die Fall-Zuordnung zu gefälscht werden in XPath 1, aber der Eingang muss jeder cased code point, die Sie und Ihre Benutzer jemals brauchen werden:
translate(..,'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ')
Zusätzlich:
Müssen Sie Streifen aus alle Apostroph-Zeichen aus $Abfrage, um zu vermeiden brechen Ihre expression.
In XPath 2.0 können Sie double-up die quote in den Begrenzer zu setzen, dass die quote in einem string-literal, aber in XPath 1.0 ist es unmöglich, das Trennzeichen in der Zeichenkette.