2009-08-21 5 views
1

Ich beginne damit, Ihnen den Code zu geben, an dem ich gerade arbeite, damit Sie dem folgen können, was ich sage (Entschuldigung für das Französisch, ich merke, dass Sie alle kein Französisch sprechen, aber ich mache diese Website für eine französischsprachige Schule). Ich habe herausgeschnitten, was ich glaube nicht, ein Teil des Problems ist (die tatsächliche Datei ist 757 Zeilen lang!)Warum kann Javascript keine Zeichenfolgen finden und ersetzen, die Leerzeichen in der URL enthalten?

photos.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
<title>Photos</title> 
<script type="text/javascript"> 
    function removeCriterion(criterionText) 
    { 
     var getData = new RegExp("&" + criterionText + "|\\?" + criterionText + "$|" + criterionText + "&", "gi"); 
     window.location = window.location.toString().replace(getData,""); 
    } 
</script> 
</head> 
<body> 
<a class="retirerCritere" onclick="removeCriterion('Shawn+Freyssonnet-Inder');" title="Réessayer la recherche sans ce critère"><img src="img/deleteButton.png" alt="Retirer" /></a> 
</body> 
</html> 

Obwohl es nicht nach viel aussieht mit all den ausgestellten Extras ist dies Teil einer Seite, auf der Fotos basierend auf einer Reihe von Kriterien angezeigt werden. Diese Kriterien werden geholt durch PHP-Variable $ _GET, also wenn ich alle Fotos zeigen wollen, die mir gehören (Shawn Freyssonnet-Inder) und die wurden in Frankreich genommen, ich benutze den folgenden Link:

<a href="photos.php?nom=Shawn+Freyssonnet-Inder&pays=France" ...>link</a> 

Diese Seite holt dann alle Fotos für die nom = Shawn Freyssonnet-Inder und = Frankreich in einer mySQL-Datenbank bezahlt. Darüber hinaus zeigt es dem Benutzer die Liste der Kriterien zum Filtern der Ergebnisse, die es ihm ermöglichen, ein Kriterium zu isolieren, ein Kriterium zu entfernen usw.

Hinweis: Der Speicherplatz wird durch ein Pluszeichen ersetzt (+) mit php funktion urlencode. Ich entferne das Pluszeichen unter Verwendung von urldecode, bevor ich den TXT auf der Seite zeige, und stelle sicher, dass der Benutzer über die entsprechende benutzerfreundliche Version der Zeichenfolge verfügt. Jetzt, wenn ich die removeCriterion Funktion anrufe, benutze ich das gleiche urlencode d Schnur als Argument, also glaube ich, dass es kein Problem für Javascript geben sollte, den Text in der URL zu finden.

Mein Problem tritt auf, wenn versucht wird, ein Kriterium zu entfernen. Wie Sie sehen können, entferne ich Kriterien mit der JavaScript-Funktion removeCriterion, die einfach die Kriteriumdefinition in der URL findet und entfernt (suchen und ersetzen). Aber aus bestimmten Gründen funktioniert es bei bestimmten Kriterien nicht, zB "Shawn Freyssonnet-Inder" oder andere Strings mit Leerzeichen.

Würde jemand von Ihnen wissen, warum Javascript Strings, die Leerzeichen in der URL enthalten, nicht finden und ersetzen kann?

Antwort

2

In einen regulären Ausdruck Escape-Funktion:

RegExp.escape = function (s) { 
    return s.replace(/([.*+?^${}()|[\]\/\\])/g, '\\$1'); 
}; 

Wenn von Strings Aufbau von regulären Ausdrücken, sollten Sie die Saiten wie folgt entkommen:

function removeCriterion(criterionText) { 
    var getData = new RegExp("&" + RegExp.escape(criterionText) + "|\\?" + 
            RegExp.escape(criterionText) + "$|" + 
            RegExp.escape(criterionText) + "&", "gi"); 
    window.location = window.location.toString().replace(getData,""); 
} 

Regulärer Ausdruck Operatoren wie plus, sollte jetzt hör auf Probleme zu verursachen.

+0

Diese besondere Lösung scheint nicht in meinem Fall zu funktionieren – Shawn

+0

Ok, es funktioniert jetzt, ich hatte JavaScript zu verwenden, um die PHP-Funktion urlencode zu simulieren, damit die Zeichenfolge in der URL gefunden werden kann. (Ich wusste nicht, dass $ _GET automatisch urldecode's ...) Vielen Dank, dass Sie mir geholfen haben, dieses 2 Wochen lange Problem zu lösen: p – Shawn

1

Sie könnten eine URL auf der Serverseite ohne den Parameter nom generieren, anstatt dies in clientseitigem JavaScript zu tun.

Zum Beispiel auf der Serverseite, sagen wir, Sie haben die Anfrage mit nom & pays Parameter erhalten; Sie könnten eine Verknüpfung vom serverseitigen Code generieren, der den Parameter pays ausschließt.

Ist das nicht einfach zu tun? Lass es mich wissen, wenn ich die Frage falsch verstanden habe.

EDIT:

<a href="photos.php?pays="<%=variableForCountry%>" ...>link</a> 

Dies ist, wie es in ASP getan werden könnte. Tut mir leid, ich habe PHP nicht benutzt.

+0

Ich empfehle diesen Ansatz auch. Ich weiß, dass es sich um Regexes handelt, aber Strings von Grund auf zu erzeugen ist viel, viel einfacher als existierende Strings zu erzeugen. –

6

Im regulären Ausdruck hat das Pluszeichen (+) eine besondere Bedeutung - es bedeutet, den vorherigen Eintrag ein oder mehrmals zu wiederholen.

Sie benötigen das Pluszeichen, um zu entkommen für den wörtlichen und Zeichen darzustellen:

criterionText = criterionText.replace(/\+/g, '\\+'); 
+0

Dies ist genau das, was ich vorschlagen würde, obwohl ich mich für das Leben von mir nicht an die Regex-Syntax erinnern konnte. – Joel

+0

Ähnlich wie Borgars Antwort (http://stackoverflow.com/questions/1314382/why-cant-javascript-find-and-replace-strings-containing-spaces-in-the-url/1314880#1314880), das tut nicht t scheint in meiner Situation zu arbeiten – Shawn

2

Sie haben Ihr Skript ganz nach hinten eigentlich. Sie rufen removeCriterion mit dem Wert für das Feld auf, aber die Regex sucht nach '?' + criterionText, die nur auf den Schlüssel für das Schlüssel/Wert-Paar passt.

+0

criterionText enthält sowohl den Schlüssel und den Wert, zum Beispiel: "nom = Shawn + Freyssonnet-Inder" – Shawn

Verwandte Themen