Почему javascript не может найти и заменить строки, содержащие пробелы в URL? - PullRequest
1 голос
/ 22 августа 2009

Я начну с того, что дам вам код, над которым я работаю, чтобы вы могли следовать тому, что я говорю (извините за французский, я понимаю, что вы все не говорите по-французски, но я делаю это сайт для франкоязычной школы). Я отредактировал то, что, по моему мнению, не является частью проблемы (фактический файл имеет длину 757 строк!)

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>

Несмотря на то, что все лишние дополнения выглядят не так уж и много, эта часть страницы отображает фотографии, основанные на наборе критериев. Эти критерии выбираются через переменную php $ _GET, поэтому, если я хочу показать все фотографии, которые принадлежат мне (Shawn Freyssonnet-Inder) и которые были сделаны во Франции, я использую следующую ссылку:

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

Затем эта страница получает все фотографии, за которые nom = Shawn Freyssonnet-Inder и платит = Франция в базе данных mysql. Кроме того, он показывает пользователю список критериев, используемых для фильтрации результатов, позволяя ему (ей) выделить критерий, удалить критерий и т. Д.

примечание: Пробел заменяется знаком плюс (+) с функцией php urlencode . Я удаляю знак плюс, используя urldecode , прежде чем показывать текст на странице, чтобы убедиться, что у пользователя есть подходящая для человека версия строки. Теперь, когда я вызываю функцию removeCriterion , я использую ту же строку urlencode d в качестве аргумента, поэтому я считаю, что для javascript не должно быть проблем с поиском текста в URL.

Моя проблема возникает при попытке удалить критерий. Как вы можете видеть, я удаляю критерии с помощью функции javascript removeCriterion , которая просто находит определение критерия в URL и удаляет его (найти и заменить). Но по некоторым причинам, по определенным критериям, он не работает, например, «Shawn Freyssonnet-Inder» или другие строки с пробелами.

Кто-нибудь из вас знает, почему javascript не может найти и заменить строки, содержащие пробелы в URL-адресе?

Ответы [ 4 ]

6 голосов
/ 22 августа 2009

В регулярном выражении знак плюс (+) имеет особое значение - это означает, что предыдущий элемент нужно повторить один или несколько раз.

Вам потребуется экранировать знак плюс, чтобы он представлял буквальный символ плюса:

criterionText = criterionText.replace(/\+/g, '\\+');
2 голосов
/ 22 августа 2009

Добавить escape-функцию регулярного выражения:

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

При построении регулярных выражений из строк вы должны экранировать строки следующим образом:

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

Операторы регулярных выражений, такие как плюс, теперь должны перестать вызывать проблемы.

2 голосов
/ 22 августа 2009

Ваш сценарий на самом деле довольно задом наперед. Вы вызываете removeCriterion со значением для поля, но регулярное выражение ищет '?' + criterionText, который будет соответствовать только ключу для пары ключ / значение.

1 голос
/ 22 августа 2009

Вы можете создать URL на стороне сервера без параметра nom вместо того, чтобы делать это в клиентском JavaScript.

Например, на стороне сервера, скажем, вы получили запрос с параметром nom & pays; вы можете создать ссылку из кода на стороне сервера, который исключает параметр pays.

Разве это не так просто сделать? Дайте мне знать, если я неправильно понял вопрос.

РЕДАКТИРОВАТЬ:

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

Вот как это можно сделать в ASP. Извините, я не использовал PHP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...