Как я могу удалить пустые поля из моей формы в строке запроса? - PullRequest
21 голосов
/ 08 мая 2011

У меня есть простая форма с четырьмя входами.Когда я отправляю свою форму, я хочу использовать метод GET http.

Например:

aaa : foo
bbb : ____
ccc : bar
ddd : ____

Я хочу получить эту строку запроса:

/?aaa=foo&ccc=bar

Проблема в том, что у меня есть строка запроса:

/?aaa=foo&bbb=&ccc=bar&ddd=

Как удалить пустые поля из формы в строке запроса?

Спасибо.

Ответы [ 4 ]

13 голосов
/ 16 мая 2011

Вы можете использовать функцию jQuery submit для проверки или изменения вашей формы:

<form method="get" id="form1">
    <input type="text" name="aaa" id="aaa" /> 
    <input type="text" name="bbb" id="bbb" /> 
    <input type="submit" value="Go" />
</form>
<script type="text/javascript">
    $(document).ready(function() {
        $("#form1").submit(function() {
            if($("#bbb").val()=="") {
                    $("#bbb").remove();
            }
        });
     });
</script>
5 голосов
/ 03 мая 2015

Текущие решения зависят от клиента, использующего Javascript / jQuery - что не может быть гарантировано.Другой вариант - использовать правило перезаписи.На сервере Apache я использовал следующее, чтобы убрать пустые значения $ _GET из отправленных форм;

RewriteCond %{REQUEST_URI} \/formpage\/?
RewriteCond %{QUERY_STRING} ^(.*)(&|\?)[a-z-_]+=(?=&|$)(.*)$ [NC]
RewriteRule .* \/formpage?%1%2 [R,L,NE]

..., что перевернуло бы это;;

http://www.yoursite.com/formpage?search=staff&year=&firstname=&surname=smith&area=

... в это;

http://www.yoursite.com/formpage?search=staff&surname=smith

Краткое объяснение:

  1. RewriteCond %{REQUEST_URI} \/formpage\/? - это способ ограничить область вашего регулярного выражения определенной подстраницей адреса вашего сайта (например, http://www.yoursite.com/formpage). Это не обязательно, но вы можете пожелатьприменить выражение только к странице, на которой появляется форма. Это один из способов выполнить это.

  2. RewriteCond %{QUERY_STRING} ^(.*)(&|\?)[a-z-_]+=(?=&|$)(.*)$ [NC] - это второе условие, которое затем сопоставляется со строкой запроса (то есть все, что появляется из (или включая) вопросительный знак, например ?firstname=sam$surname=smith). Давайте разберем его;

    • ^(.*) - Символ ^ означает, что это НАЧАЛОстрока запроса и период . говорят о ЛЮБОМ символе. Звездочка * является модификатором периодаподстановочный знак, говорящий о том, что любое количество из них должно быть включено в область действия.
    • (&|\?)[a-z-_]+=(?=&|$) - это самый интересный бит (если вам нравятся такие вещи ...).Это находит вашу пустую строку запроса.Между первыми скобками мы заявляем, что строка начинается с амперсанда ИЛИ с буквальным знаком вопроса (обратная косая черта делает следующий символ буквальным, в данном случае - в противном случае знак вопроса имеет другое значение).Между квадратными скобками мы говорим, что соответствуют любому символу из az, ИЛИ дефису - ИЛИ подчеркиванию _, и сразу после этого символ плюса + указывает, что мы должны соответствовать любому из этих предыдущих символов 1 или болеераз.Знак равенства = как раз и выглядит (равенство между именем строки запроса и ее значением).Наконец, между следующими круглыми скобками у нас есть предварительное предложение ?=, в котором говорится, что следующий символ ДОЛЖЕН БЫТЬ АМПЕРСАНДОМ ИЛИ в самом конце строки, как указано знаком доллара $.Предполагается, что ваша строка запроса будет считаться совпадающей, только если за ней следует начало другой строки запроса или конец строки без , включая значение.
    • Последние биты(.*)$ [NC] просто сопоставляется с любым содержимым, которое следует за пустой строкой запроса, а предложение [NC] означает, что это случай iSsENsiTIve.
  3. RewriteRule .* \/formpage?%1%2 [R,L,NE]где мы говорим mod_rewrite, что делать с нашим соответствующим контентом.По сути, переписав URL-адрес вашего имени страницы, следуйте всей строке запроса , за исключением соответствующих пустых строк.Поскольку это будет зацикливать ваш URL до тех пор, пока он не перестанет находить совпадение, не имеет значения, если у вас есть одно пустое значение или 50. Он должен определить их все и оставить только те параметры, которые были переданы со значениями.Предложение [NE] в правиле перезаписи означает, что символы не будут закодированы в URL - что может или не может быть полезным для вас, если вы ожидаете специальных символов (но вам, очевидно, необходимо очистить данные $ _GETкогда вы его обрабатываете, что вы должны делать в любом случае).

Опять же - это, очевидно, решение Apache, использующее mod_rewrite.Если вы работаете в другой операционной системе (например, на сервере Windows), это необходимо изменить соответствующим образом.

Надеюсь, это кому-нибудь пригодится.

5 голосов
/ 30 мая 2013

Мне нравится идея RaphDG

Но я немного изменил код.Я просто использую свойство disabled вместо удаления поля.Вот измененный код:

<form method="get" id="form1">
    <input type="text" name="aaa" id="aaa" /> 
    <input type="text" name="bbb" id="bbb" /> 
    <input type="submit" value="Go" />
</form>
<script type="text/javascript">
    $(document).ready(function() {
        $("#form1").submit(function() {
            if($("#bbb").val()=="") {
                    $("#bbb").prop('disabled', true);
            }
        });
     });
</script>

Еще раз спасибо за идею RaphDG (y)

1 голос
/ 18 ноября 2017

С jQuery:

$('form[method="get"]').submit(function(){
    $(this).find(':input').each(function() {
        var inp = $(this);
        if (!inp.val()) {
            inp.remove();
        }
    });
});

Я использую это, чтобы удалить все пустые параметры из всех форм GET на моем сайте. Псевдоселектор: input охватывает все входы, текстовые области, кнопки выбора и.

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