Замените '&' на 'и' на лету в PHP - PullRequest
0 голосов
/ 01 февраля 2012

Есть ли способ заменить символ & на and в веб-форме PHP, когда пользователь вводит его, а не после отправки формы?

Когда & вставляется в нашу базу данныхнаша поисковая система не интерпретирует &, правильно заменяя его на &, возвращая неверный результат поиска (т. е. не тот результат, который включал &).

Вот поле, которое мы хотели бы запуститьэто на:

<input type="text" name="project_title" id="project_title" value="<?php echo $project_title; ?>" size="60" class="btn_input2"/>

Ответы [ 3 ]

4 голосов
/ 01 февраля 2012

Есть ли способ заменить символ & на и в веб-форме PHP, когда пользователь вводит ее, а не после отправки формы?

PHP находится на сервере, он не контролирует что-либо происходящее ни при каких обстоятельствах на стороне клиента. Он отправляет необработанный текст с веб-сервера, 100-мегатонное термоядерное устройство взрывается, и PHP больше не существует после отправки контента. Просто документ, полученный на вашей стороне клиента, остается. Чтобы работать с эффектами на стороне клиента, вам нужно работать с JavaScript.

Для этого вы должны выбрать свою любимую библиотеку JavaScript и добавить прослушиватель событий для событий «keyup». Замените амперсанды на «и» и поместите текст замены обратно в поле. Mugur опубликовал ответ, который показывает вам, как это сделать.

Это ужасное решение на практике, потому что ваши пользователи будут кричать о кровавом правосудии, чтобы избавить их от такого ужасного пользовательского опыта. В итоге вы заменили входной текст чем-то, что им не нужно. Другие поисковые инструменты делают это, почему не ваш? Вы нажали клавишу Backspace, тогда что? Когда вы нажимаете на текст, вы, вероятно, теряете позицию курсора.

Мало того, вы лечите симптом, а не его причину. Посмотрите, почему вы делаете это:

Причина в том, что когда & вставляется в нашу базу данных, наша поисковая система выдает его и заменяет его на &, которое затем возвращает неверный результат (т.е. не тот результат, который включает &).

Нет, ваша база данных и поисковая система не делают такие вещи, как "отключение". Вы не знаете, что происходит, и пытаетесь лечить симптомы, а не узнаете причину и устраните ее. Ваше лечение симптомов создаст БОЛЬШЕ проблем в будущем. Не делай этого.

&amp; - это код сущности HTML. У каждого «особенного» персонажа есть один. Это означает, что ваша база данных также кодирует > как &gt;, а также символы с акцентами в них (например, тексты на французском, немецком или испанском языках). Вы получаете "неправильные" результаты для всех этих.

Вы не показывали код, поэтому не получаете код. Но вот в чем твоя проблема.

Ваш код преобразует необработанный текст в коды сущностей HTML, где это необходимо, вы ищете по некодированной строке.

Вариант 1: устранить причину

Кодируйте текст поиска с помощью сущностей HTML, чтобы он соответствовал всем этим случаям. Сопоставьте персонажей акцента с их двоюродными братьями без акцента, чтобы поиск «francais» мог вернуть «français».

Вариант 2: устранить один симптом

Заменить строку для амперсандов на стороне клиента или сервера, ваш поиск прерывается на все остальные кодировки. Никогда не находите тексты типа «Боб> Салли». Никогда не находите "français".

2 голосов
/ 01 февраля 2012

Перед отправкой формы вам нужно будет использовать JavaScript для изменения по мере того, как пользователь вводит ее. Не идеально, поскольку JS можно отключить.

Было бы намного лучше "очистить" амперсандыпосле отправки, но перед вставкой в ​​базу данных.

Должно работать простое str_replace:

str_replace(' & ',' and ', $_POST['value']);

Но, как отмечали другие, это не очень хорошее решение.Лучшим решением было бы закодировать амперсанды по мере их поступления в базу данных (что, кажется, происходит сейчас), а затем изменить сценарий поиска, чтобы учесть это.

2 голосов
/ 01 февраля 2012

Вы можете сделать это, заполнив форму с помощью jquery следующим образом:

$('#input').change(function() { // edited conforming Icognito suggestion
  var some_val =  $('#input').val().replace('&', 'and');
   $('#input').val( some_val );
});

РЕДАКТИРОВАТЬ: рабочий пример (http://jsfiddle.net/4gXZW/13/)

JS:

$('.target').change(function() {
    $('.target').val($('.target').val().replace('&', 'and'));
});

HTML:

<input class="target" type="text" value="Field 1" />

В противном случае вы можете сделать это в PHP до insert sql.

$to_insert = str_replace("&", "and", $_POST['your_variable']);
...