Доброго времени суток! Возникла проблема с работой stripslashes();, функция удаляет не только экранирование символов, но и все остальные слэши (соответственно тоже проэкранированные). Но сама фишка в том, что эта проблема возникает только на иврите, то есть имеется большой мультиязычный сайт, на всех языках, кроме иврита все правильно работает. PHP: <?php //так как иврит пишется справа налево, то: $str = "конец строки (иврит) \\ начало строки (иврит)"; // выводит: конец строки (иврит) начало строки (иврит) echo stripslashes($str); ?> Чем вызвана проблема, а если это не проблема, то поделитесь секретом работы функции со строками на иврите. Да, экранирование выполнено с помощью addslashes(); Заранее благодарен за помощь!
DarkKemPeR addslashes делается при занесении в базу данных обычно, или ещё куда-либо, где строки заключаются в кавычки. при получении данных с базы данных делать stripslashes не нужно. в приведённом тобой примере всё работает правильно. т.е. когда ты пишешь $str = "конец строки (иврит) \\ начало строки (иврит)" пхп сохраняет в память строку конец строки (иврит) \ начало строки (иврит), а когда ты делаешь stripslashes, то этот единственный слеш как раз и убирается.
Gromo, так в том и дело, что хранится у меня все в ассоциативном массиве, вида: PHP: array('1'=>'фраза на иврите, где могут быть как \' так и \" - поэтому экранирование делаю'') И еще раз хочу заметить, что на языках: русский, английский, немецкий, румынский и украинский, то языки типа LTR - все работает, вот RTL - не хочет.
DarkKemPeR напиши сюда пример строки на иврите, где необходимо экранирование символов. саму строку, неэкранированную
Ну, например, вот: PHP: $str = 'שמש, זריחה\\שקיעה'; *Слэш уже проэкранирован, если просто без экрана, соответственно вот: PHP: $str = 'שמש, זריחה\שקיעה';
DarkKemPeR ну, у меня всё работает вроде как надо <?php $text = 'שמש, זריחה\שקיעה'; echo $text.'<br>'; $text = addslashes($text); echo $text.'<br>'; $text = stripslashes($text); echo $text.'<br>'; ?> выводит: שמש, זריחה\שקיעה שמש, זריחה\\שקיעה שמש, זריחה\שקיעה
у меня нет поэтому сюда и написал, интересно тогда почему такая проблема возникает, хотя все верно работает в других языках. Нет вариантов?
DarkKemPeR возможно текст портится при вводе/выводе, т.к. функции работают вроде как надо. необходимо проследить содержимое строки до ввода, после экранирования и после убирания слешей. и в этом тебе поможет обычный эхо на страницу, или гадить в лог файл
Я полностью могу проследить путь строки, потому что приложение я писал, строка после экранирования попадает в языковую библиотеку (располагается локально на сервере в виде файлов), построенную на ассоциативных массивах, я уже вверху это указывал, так вот выглядит так в итоге: $lang_arr = array( '1'=>'זריחה\\שקיעה', '2'=>'бла бла'); после чего по ключу мы обращаемся к кому либо, в этот то момент и происходит вызов stripslashes();, примерно: PHP: return stripslashes($lang_arr[1]); Так что вот так, подожду может еще чего интересного напишут
DarkKemPeR возможно тут поможет хак, проверяешь язык - если иврит, то stripslashes не делать. а возможно, что и вообще stripslashes делать необязательно для любого языка. попробуй без
Вот какое дело то получается, если не делать stripslashes(); для иврита или же любого другого языка, все экранированные символы так и вылезут в текст, то есть будет: \', \", \\ и т.п. - пробовал Если же вообще экранирование не делать, то сколько же мороки будет тогда с символами в тексте типа одинарных или двойных кавычек. А в иврите так подавно, в одной строке может содержаться и то и то, потому что это части слов На самом деле все это нужно, но почему с ивритом оно не во всегда дружит, вот это вопрос. Самое обидное, что все работает нормально и правильно с остальными языками.
Сейчас проверил одну идею, которая показалась мне крайне бестолковой. До приема строки в addslashes(); я добавил еще один слэш, то есть получилось: PHP: $str = 'текст на иврите \\ текст на иврите'; //после addslashes(); соответственно в библиотеке оказалось: //текст на иврите \\\\ текст на иврите echo addslashes($str); Самое странное, что после stripslashes();, я увидел строку: текст на иврите \ текст на иврите, то есть все правильно! Но почему так странно? Переделывать во всем переводе \ на \\ очень не рационально, особенно когда должно и так работать. Еще мысли?
DarkKemPeR тогда лови случаи, в какой момент происходит неправильное преобразование текста. другого совета дать не могу. можешь выложить кусок проблемного кода, где собственно происходит добавление/удаление слешей, попробуем, отпишемся. да и сам попробуешь тоже
все равно не должно так быть. это какой-то косяк где-то вне скрипта скорее всего =) может какойнить хтмлэнтитис натравить?
О том я и говорю, что в скрипте все верно написано, просто он ведь работает на остальных языках. Кстати, идея с htmlentities(); это идея, можно просто для иврита сделать хак, или же просто дальше тупо во всем тексте менять одинарные слэше на двойные, чтобы с экраном получалось четыре обратных \\\\ - глупо, но работает...