Regex вызывает удаление части имени

0

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

if (!preg_match("/^[a-zA-Z' ]*$/",$name)) {
    $name = "";
    $nameErr = "Only letters and white space allowed";
}  

у меня тоже есть

$name = mysqli_real_escape_string($con, $_POST['name']);

в том же коде, потому что я не хочу, чтобы движок думал, что конец строки достигнут, когда на самом деле этого не произошло. Но моя проблема заключается в том, что когда я вхожу в такое имя, как Кейт О'Мара в поле формы имени, что заканчивается в базе данных Кейт О. Почему это происходит? Регулярное выражение, которое вы видите, имеет внутри себя апостроф (и вам даже не нужно его избегать, потому что оно находится внутри класса символов). Почему все после апострофа в отбрасываемой фамилии? Регулярное выражение ДОЛЖНО распознать полное имя.

  • 0
    Покажите нам, как вы пишете данные в базу данных.
  • 2
    Регулярное выражение не делает ничего, что могло бы обрезать имя в апострофе, я бы посмотрел на проблемы, связанные с magic_quotes_gpc , напечатал запрос перед его выполнением или - лучшая рекомендация - переключился на подготовленные операторы SQL.
Показать ещё 4 комментария
Теги:

2 ответа

1
Лучший ответ

В общем, я думаю, что ваше регулярное выражение глубоко испорчено. Поскольку вы используете mysqli_real_escape_string, апостроф в "O'Mara" ускользает (добавляет обратную косую черту), что приводит к сбою вашего preg_match. Не только это, но люди с именами, такими как Mañuella, Günter или André, не имеют шансов. Ни люди с именами, содержащими тире (Жан-Люк).
В целом, лучше всего проверить количество символов, которые вряд ли можно найти в имени:

if (preg_match('/[@#$%*=+&![\]{};?]/', $name))

не является совершенным, но это начало. Вы должны помнить, что Интернет - это место, где собираются люди со всего мира. Они не все говорят на одном языке, и не все имеют один и тот же алфавит (многобайтовые символы!). Также подумайте о наших азиатских друзьях. Моя подруга - азиатская, а ее фамилия содержит всего 2 персонажа. Я даже не могу сказать, сколько раз она получила ответ "Фамилия должна быть 3 символа или больше".

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

  • 0
    Его код не делает ничего, что могло бы отрезать название. Если регулярное выражение находит пробел \ , он делает $name = "" поэтому я ожидаю, что запись в базе данных будет пустой, а не обрезанной. Вот почему я все еще верю, что в области неправильного построения запросов mysqli происходит что-то еще.
  • 0
    @funkwurm: OP не показывал нам весь код, возможно, он вызывает preg_match во второй раз и использует только совпадение в качестве значения. Тем не менее: mysqli_real_escape_string - это не путь и не слишком mysqli_real_escape_string проверка имени
Показать ещё 1 комментарий
0

mysqli_real_escape_string escapes ' as \'. И вот почему он обрезается. (Ссылка)

Кроме того, имейте в виду, что некоторые люди имеют дефисы (-) по фамилиям или могут иметь специальные символы (например, польские ąęśźćżółń или немецкие персонажи).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню