За последние 24 часа нас посетили 19299 программистов и 1631 робот. Сейчас ищут 869 программистов ...

Непонятное поведение stripslashes() с RTL

Тема в разделе "Прочие вопросы по PHP", создана пользователем DarkKemPeR, 4 апр 2011.

  1. DarkKemPeR

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

    С нами с:
    11 мар 2011
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    мы пришли остается загадкой...
    Доброго времени суток! Возникла проблема с работой stripslashes();, функция удаляет не только экранирование символов, но и все остальные слэши (соответственно тоже проэкранированные). Но сама фишка в том, что эта проблема возникает только на иврите, то есть имеется большой мультиязычный сайт, на всех языках, кроме иврита все правильно работает.

    PHP:
    1.  
    2. <?php
    3. //так как иврит пишется справа налево, то:
    4. $str = "конец строки (иврит) \\ начало строки (иврит)";
    5.  
    6. // выводит: конец строки (иврит)  начало строки (иврит)
    7. echo stripslashes($str);
    8. ?>
    9.  
    Чем вызвана проблема, а если это не проблема, то поделитесь секретом работы функции со строками на иврите. Да, экранирование выполнено с помощью addslashes(); Заранее благодарен за помощь!
     
  2. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    DarkKemPeR
    addslashes делается при занесении в базу данных обычно, или ещё куда-либо, где строки заключаются в кавычки.
    при получении данных с базы данных делать stripslashes не нужно.

    в приведённом тобой примере всё работает правильно. т.е. когда ты пишешь $str = "конец строки (иврит) \\ начало строки (иврит)" пхп сохраняет в память строку конец строки (иврит) \ начало строки (иврит), а когда ты делаешь stripslashes, то этот единственный слеш как раз и убирается.
     
  3. DarkKemPeR

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

    С нами с:
    11 мар 2011
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    мы пришли остается загадкой...
    Gromo, так в том и дело, что хранится у меня все в ассоциативном массиве, вида:
    PHP:
    1.  
    2. array('1'=>'фраза на иврите, где могут быть как \' так и \" - поэтому экранирование делаю'')
    3.  
    И еще раз хочу заметить, что на языках: русский, английский, немецкий, румынский и украинский, то языки типа LTR - все работает, вот RTL - не хочет.
     
  4. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    DarkKemPeR
    напиши сюда пример строки на иврите, где необходимо экранирование символов. саму строку, неэкранированную
     
  5. DarkKemPeR

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

    С нами с:
    11 мар 2011
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    мы пришли остается загадкой...
    Ну, например, вот:
    PHP:
    1. $str = 'שמש, זריחה\\שקיעה';
    *Слэш уже проэкранирован, если просто без экрана, соответственно вот:
    PHP:
    1. $str = 'שמש, זריחה\שקיעה';
     
  6. DarkKemPeR

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

    С нами с:
    11 мар 2011
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    мы пришли остается загадкой...
    К сожалению, форум не смог отобразить слова на иврите, а заменил их на сущности, плохо.
     
  7. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    DarkKemPeR
    ну, у меня всё работает вроде как надо

    <?php

    $text = 'שמש, זריחה\שקיעה';
    echo $text.'<br>';
    $text = addslashes($text);
    echo $text.'<br>';
    $text = stripslashes($text);
    echo $text.'<br>';

    ?>

    выводит:

    שמש, זריחה\שקיעה
    שמש, זריחה\\שקיעה
    שמש, זריחה\שקיעה
     
  8. DarkKemPeR

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

    С нами с:
    11 мар 2011
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    мы пришли остается загадкой...
    у меня нет :( поэтому сюда и написал, интересно тогда почему такая проблема возникает, хотя все верно работает в других языках. Нет вариантов?
     
  9. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    DarkKemPeR
    возможно текст портится при вводе/выводе, т.к. функции работают вроде как надо.
    необходимо проследить содержимое строки до ввода, после экранирования и после убирания слешей.
    и в этом тебе поможет обычный эхо на страницу, или гадить в лог файл :)
     
  10. DarkKemPeR

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

    С нами с:
    11 мар 2011
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    мы пришли остается загадкой...
    Я полностью могу проследить путь строки, потому что приложение я писал, строка после экранирования попадает в языковую библиотеку (располагается локально на сервере в виде файлов), построенную на ассоциативных массивах, я уже вверху это указывал, так вот выглядит так в итоге:
    $lang_arr = array(
    '1'=>'זריחה\\שקיעה',
    '2'=>'бла бла');
    после чего по ключу мы обращаемся к кому либо, в этот то момент и происходит вызов stripslashes();, примерно:
    PHP:
    1. return stripslashes($lang_arr[1]);
    Так что вот так, подожду может еще чего интересного напишут:)
     
  11. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    DarkKemPeR
    возможно тут поможет хак, проверяешь язык - если иврит, то stripslashes не делать.
    а возможно, что и вообще stripslashes делать необязательно для любого языка. попробуй без :)
     
  12. DarkKemPeR

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

    С нами с:
    11 мар 2011
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    мы пришли остается загадкой...
    Вот какое дело то получается, если не делать stripslashes(); для иврита или же любого другого языка, все экранированные символы так и вылезут в текст, то есть будет: \', \", \\ и т.п. - пробовал:)
    Если же вообще экранирование не делать, то сколько же мороки будет тогда с символами в тексте типа одинарных или двойных кавычек. А в иврите так подавно, в одной строке может содержаться и то и то, потому что это части слов:)
    На самом деле все это нужно, но почему с ивритом оно не во всегда дружит, вот это вопрос. Самое обидное, что все работает нормально и правильно с остальными языками.
     
  13. DarkKemPeR

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

    С нами с:
    11 мар 2011
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    мы пришли остается загадкой...
    Сейчас проверил одну идею, которая показалась мне крайне бестолковой. До приема строки в addslashes(); я добавил еще один слэш, то есть получилось:

    PHP:
    1. $str = 'текст на иврите \\ текст на иврите';
    2. //после addslashes(); соответственно в библиотеке оказалось:
    3. //текст на иврите \\\\ текст на иврите
    4. echo addslashes($str);
    Самое странное, что после stripslashes();, я увидел строку: текст на иврите \ текст на иврите, то есть все правильно! Но почему так странно?:) Переделывать во всем переводе \ на \\ очень не рационально, особенно когда должно и так работать. Еще мысли? :)
     
  14. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    DarkKemPeR
    тогда лови случаи, в какой момент происходит неправильное преобразование текста. другого совета дать не могу.
    можешь выложить кусок проблемного кода, где собственно происходит добавление/удаление слешей, попробуем, отпишемся. да и сам попробуешь тоже
     
  15. DarkKemPeR

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

    С нами с:
    11 мар 2011
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    мы пришли остается загадкой...
    Прошу взглянуть на сообщение выше - одновременно с вами добавил.
     
  16. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    все равно не должно так быть. это какой-то косяк где-то вне скрипта скорее всего =)

    может какойнить хтмлэнтитис натравить?
     
  17. DarkKemPeR

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

    С нами с:
    11 мар 2011
    Сообщения:
    13
    Симпатии:
    0
    Адрес:
    мы пришли остается загадкой...
    О том я и говорю, что в скрипте все верно написано, просто он ведь работает на остальных языках.
    Кстати, идея с htmlentities(); это идея, можно просто для иврита сделать хак, или же просто дальше тупо во всем тексте менять одинарные слэше на двойные, чтобы с экраном получалось четыре обратных \\\\ - глупо, но работает...