За последние 24 часа нас посетили 20562 программиста и 1324 робота. Сейчас ищут 694 программиста ...

Апострофы и одинарные кавычки

Тема в разделе "PHP для новичков", создана пользователем Dimasick, 28 апр 2015.

  1. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    Есть html-форма, юзер вводит строку st, строка отправляется на сервер и php-скриптом строка st записывется в БД (SQL). Нужно, чтобы у юзера была возможность в этой строке в качестве символов использовать такие виды кавычек и апостроф:
    - ’
    ' - '
    ` - `
    Вопросы:
    1. Как правильно принять такую строку на сервере и записать ее в БД?
    2. Как правильно потом брать такую строку из БД и выводить в браузере и в полях форм?
    3. Как правильноо должна выглядеть проверка строки на наличие этих символов, если сейчас проверка выглядит так (допустимые символы):
    Код (Text):
    1. preg_match('/^[\sa-z_\-\\\]{0,50}$/' , $st) ;
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
  3. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    Я уже пытался лепить real_escape_string, но ничего не выходит. Нужен конкретный пример кода.
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    вот и показывай как пытался, чего ожидал и что увидел в итоге. эта функция придумана для экранирования символов которые могут поломать запрос. если она у тебя не заработала значит ты её не так готовил.
     
  5. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    Начнем с того, как правильно должна выглядеть проверка строки на наличие этих символов, если сейчас проверка выглядит так (допустимые символы):
    Код (Text):
    1. preg_match('/^[\sa-z_\-\\\]{0,50}$/' , $st) ;
    ?
     
  6. mr.akv

    mr.akv Активный пользователь

    С нами с:
    31 мар 2015
    Сообщения:
    1.604
    Симпатии:
    206
    Непонятно вот, нужна вам помощь или нет. Чтобы вам что-то подсказать, знающие люди просят одно, вы же уходите на "нет" и снова талдычите своё. Отсюда вывод: что вы не сильно то и хотите, чтобы вам помогали.
     
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    Dimasick второй раз спрашиваю, зачем проверять есть ли кавычки?
     
  8. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    mr.akv, Вы о чем? Конкретный вопрос - как проверить наличие кавычек? По идее в preg_match кавычки должны вставляться в экранированном виде с бэк-слешем. Если да, то это только для кавычек или для апострофа тоже? Или апостроф вставлять через код символа? Если да, то как?
    denis01 , проверять нужно потому, что мне так нужно. Вот такие у меня ограничения. Что тут странного/непонятного/неправильного?
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    действительно. как она должна выглядеть? в данном случае наличие любого символа из списка разрешенных а так же их полное (опаньки) отсутствие - считается валидным. то есть проверка в данном случае просто для запуска компилятора регулярных выражений и поиска не важно чего. варианты исправления?
     
  10. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    Ganzal, сейчас проверка не просто "для запуска компилятора регулярных выражений и поиска не важно чего", а для проверки того, что строка от 0 до 50 символов, в которой есть только разрешенные символы (т.е. нет других кроме указанных). Строка "d_a y" пройдет такую проверку, т.е.
    Код (Text):
    1. preg_match('/^[\sa-z_\-\\\]{0,50}$/' , "d_a y") == True
    а строка "day2" не пройдет, т.е.
    Код (Text):
    1. preg_match('/^[\sa-z_\-\\\]{0,50}$/' , "day2") == False
    Или нет?
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    не пройдет - двойка в конце. я в первом случае скорее всего тоже не увидел бакса. бывает. ну тогда получается ответ уже есть - вот эта регулярка и не допускает апострофа, кавычки и грависа.
     
  12. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    Еще раз повторю вопрос: а как сделать так, чтобы ДОПУСКАЛА? Чтобы среди разрешенных символов были все апострофы и кавычки (те, что в первом посте)???
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    перечислить их в перечислении допустимых символов.

    Добавлено спустя 8 минут 4 секунды:
    ^[\sa-z_\-\\`'"’]{0,50}$ похоже работает
     
  14. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    нет, не работает. пишет Parse error, а если экранирую, то апостроф все равно не проходит.
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    о мои боги. с кем приходится работать... ну покажи же как твоя фантазия встраивает эту регулярку в пхп файл
     
  16. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    Было так:
    Код (Text):
    1. $res = preg_match('/^[\sa-z_\-\\\]{0,50}$/' , $st) ;
    Теперь с апострофами и кавычками пробовал так:
    Код (Text):
    1. $res = preg_match('/^[\s`'"’a-z_\-\\\]{0,50}$/' , $st) ;
    и так:
    Код (Text):
    1. $res = preg_match('/^[\s`'’a-z_\-\\\]{0,50}$/' , $st) ;
    и так:
    Код (Text):
    1. $res = preg_match('/^[\s\`\'\’a-z_\-\\\]{0,50}$/' , $st) ;
     
  17. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    а подумать не пробовал? если у тебя пхп-строка обрамлена одинарной кавычкой то в регулярке нужно экранировать одинарную кавычку чтоб на ней именно пхп не "закончил" строку и ты не получил ошибку разбора. двойкая кавычка и гравис не ломают строку поэтому не должны экранироваться ни в рамках строки пхп ни в рамках регулярного выражения. то есть достаточно примерно так:
    Код (Text):
    1. '/^[\sa-z_\-\\`\'"’]{0,50}$/'
     
  18. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    "Примерно" не хочет работать. Пишет Parse error: syntax error, unexpected ']'
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    слух, без обид но ты рукожопо копипастишь. я прям даже не знаю на каком языке с тобой разговаривать надо. дана строка которую нужно тупо вставить в функцию. и ты все равно умудряешься вставить так чтоб не работало. брось программирование. ты вообще не понимаешь. ранее ты уже показал что ты пытаешься везде везде эскейпа напихать толком не понимая надо ли оно вообще там. метод высоконаучного тыка?

    Код (PHP):
    1. <?php
    2. $re = '/^[\sa-z_\-\\`\'"’]{0,50}$/';
    3. $ta = array(
    4.     'abc' => 'pass',
    5.     'ab\'c' => 'pass',
    6.     'ab`c' => 'pass',
    7.     'ab"c' => 'pass',
    8.     'ab’c' => 'pass',
    9.     
    10.     'abc#' => 'fail',
    11.     'abc2' => 'fail',
    12. );
    13. foreach($ta as $t=>$e) {
    14.     $r = preg_match($re,$t) ? 'pass' : 'fail';
    15.     echo sprintf("T=%s\n exp=%s, act=%s\n%s\n\n",$t, $e, $r, $e==$r?'PASS':'FAIL');
    16. }
    Код (Text):
    1. T=abc
    2.  exp=pass, act=pass
    3. PASS
    4.  
    5. T=ab'c
    6.  exp=pass, act=pass
    7. PASS
    8.  
    9. T=ab`c
    10.  exp=pass, act=pass
    11. PASS
    12.  
    13. T=ab"c
    14.  exp=pass, act=pass
    15. PASS
    16.  
    17. T=ab’c
    18.  exp=pass, act=pass
    19. PASS
    20.  
    21. T=abc#
    22.  exp=fail, act=fail
    23. PASS
    24.  
    25. T=abc2
    26.  exp=fail, act=fail
    27. PASS
    я в принципе не удивлюсь если ты скопипастишь и увидишь результат отличный от данного.
     
  20. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    и где это я лишних эскейпов натыкал? и вот прикинь, весь твой php код скопипастил, а все равно выдает
    Parse error: syntax error, unexpected ']' in *** on line 2
    т.е. что-то в строчке
    $re = '/^[\sa-z_\-\\`\'"’]{0,50}$/';
    не так.
    Заэкранировал я последний символ:
    $re = '/^[\sa-z_\-\\`\'"\’]{0,50}$/';
    стало ругаться на
    'ab’c' => 'pass',
    поменял это на
    "ab’c" => 'pass',
    и все заработало.
    Такое впечатление что у меня апостроф (’) воспринимается так же, как и одинарная кавычка ('). В связи с этим вопрос: можно ли в preg_match символ задавать своим кодом? Если да, то как?
     
  21. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    исходник в юникоде?
     
  22. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    Нет, FAR (win-1251).
     
  23. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.902
    Симпатии:
    969
    а копипаст правильно проходит? у меня в анси корректно работает
     
  24. Dimasick

    Dimasick Активный пользователь

    С нами с:
    30 апр 2011
    Сообщения:
    57
    Симпатии:
    0
    походу именно при копипасте апостроф превращается в кавычку.
    ну не суть. так можно ли в preg_match символ задавать своим кодом? Если да, то как?
     
  25. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв