Консультация № 66607
12.12.2006, 07:38
0.00 руб.
0 12 2
Здравствуйте!

Как удалить переносв строке или что нужно сделать, чтобы получился правильный js?Строка $msg произвольная вводимая пользователем.Нужно вывести её в том же самом виде (разве что забив на форматирование). Сама строка хранится в базе данных.

Мой вариант нормально работает с текстом в одну строку, но уже вторая смущает клиентский обработчик: "Объект не найден".

Приложение:
<?$msg = mysql_escape_string(" "test message"<< hello pipl! >>");echo (‘<script>var msg = "‘.htmlspecialchars(stripcslashes($msg)).‘";document.write(msg);</script>‘);

Обсуждение

Неизвестный
12.12.2006, 09:44
общий
это ответ
Здравствуйте, Талипов А Н!
Нужно удалит все символы перевода каретки $msg=str_replace("\r\n","",$msg);
Неизвестный
12.12.2006, 10:07
общий
Спасибо, работает! Хотя мне пришлось немного адаптировать к моему случаю.Но вот, что интересно, предусматривает ли такая замена все случаи и не возникнет ли подобных ошибок в дальнейшем?
Неизвестный
13.12.2006, 14:05
общий
это ответ
Здравствуйте, Талипов А Н!
Посмотрите, в приложении функция, для корректного вывода в JS, и скрипт, который я использовал для проверки.
Вроде как все работает.
Если, что не пойдет, сообщите, пожалуйста.


Приложение:
//САМА ФУНКЦИЯ ДЛЯ ВЫВОДА В JS//q2 указывает в какие кавычки заключаем строку в JS(true(по умолчанию) - для двойных, false - для одинарных)function php2js($s,$q2=true){$q=($q2?‘"‘:"‘");return str_replace(‘script‘,$q.‘+‘.$q.‘sc‘.$q.‘+‘.$q.‘ript‘,addcslashes($s,"\\\n\r\t".$q));}//СКРИПТ ДЛЯ ПРОВЕРКИ<html><head> <title></title></head><body><script>var s=‘<?php$s=file_get_contents(__FILE__);function php2js($s,$q2=true){//$q2=true Default - for double quoted string//$q2=false - for single quoted string$q=($q2?‘"‘:"‘"); return str_replace(‘script‘,$q.‘+‘.$q.‘sc‘.$q.‘+‘.$q.‘ript‘,addcslashes($s,"\\\n\r\t".$q));}echo php2js($s,false);?>‘;alert(s);</script><hr><?php//ПРОВЕРКА СЛУЧАЙНЫХ СИМВОЛОВ//ПО КРАЙНЕЙ МЕРЕ. JS ОШИБОК НЕ ВЫДАЕТfor($c=0;$c<30;$c++){$s=‘‘;for($i=0;$i<100;$i++){ $s.=chr(rand(0,255));}echo ‘<script>alert("‘.php2js($s).‘")</script>‘;}?><button onclick="alert(s)">S</button></body></html
Неизвестный
14.12.2006, 05:45
общий
Конечно же, нашел ошибку. SCRIPT надо разбивать независимо от регистра, тогда:function php2js($s,$q2=true){ $q=($q2?‘"‘:"‘"); return str_ireplace(‘script‘, $q.‘+‘.$q.‘sc‘.$q.‘+‘.$q.‘ript‘, addcslashes($s,"\\\n\r\t".$q));}где $s-строка которую нужно преобразовать; $q2-указатель кавычек(может не очень удобно, но каждый может сделать для себя);пишем например:echo "alert(‘".php2js($sometext, false)."‘)";ДОПОЛНЕНИЕ/ИСПРАВЛЕНИЕ:str_ireplace - для PHP 5, для PHP 4 - можно использовать eregi_replace
Неизвестный
14.12.2006, 06:40
общий
HookEst, мне не очень понятен синтаксис str_ireplace в вашей функции. Оно конечно работает, но хотелось бы понимать как именно.addcslashes по моему справочнику вообще имеет только один параметр, передаваемую для обработки строку.И потом, мой вопрос вообще не о конвертации скрипта, а о конвертации строки для скрипта. На форуме ввели сообщение в поле с использованием разных символов и переносов строк, а мне нужно вывести этот текст без повреждений или преобразований.Если я правильно разобрался с дополнительным синтаксисом addcslashes, в принципе можно наверное обойтись им, разве что заменив "\n" на "
". Только вот ln2br добавляет "
", а не "
" в старых версиях php.И по моему ещё нужно добавить обработку разрыва страницы #12 (как её обозначают не знаю). D html было с какими-то параметрами "<br ...>" не помню. Возможно есть и другие символы требующии коррекции.
Неизвестный
14.12.2006, 07:57
общий
Скрипт я конвертировал просто потому, что текст скрипта - первая попавшаяся под руку большая строка с форматированием. Через функцию можно прогонять любые строки из PHP, они просто подделываются под синтаксис JS:< scr ipt>< ?=‘document.write("‘.php2js($_POST[‘name‘]).‘")‘? >< / sc ript>str_ireplace:1. ‘script‘ - то что будем менять,2. $q.‘+‘.$q.‘sc‘.$q.‘+‘.$q.‘ript‘ - то, на что будем менять(здесь вместо $q - подставятся кавычки)3. addcslashes($s,"\\\n\r\t".$q)-"заслэшенная" строка в которой будем менять.то есть, по сути str_ireplace просто разбивает словоSCRIPT на 2 части SC+RIPT, как и нужно писать в JS.по моему справочнику(php.net):addcslashes(не путать с addslashes)(PHP 4, PHP 5)string addcslashes ( string str, string charlist )Возвращает сроку str, в которой перед каждым символом из перечисленных в charlist символов добавлен обратный слэш (\). Экранируются \n, \r и т.д. в стиле языка C, символы с ASCII менее 32 и более 126 преобразуются в восьмеричное представление.т.е. вторым параметром у меня идет список спецсимволов которые в JS мы бы писали со слэшем.- обратный слэш, конец строки, перевод каретки и кавычка того типа в которые заключена строка(а насчет \f,\b - надо смотреть, но они редко встречаются, будет время добавлю) .
Неизвестный
14.12.2006, 08:48
общий
Я действительно перепутал функции. Теперь всё понятно, спасибо!Понятно кроме мелочи:@то есть, по сути str_ireplace просто разбивает словоSCRIPT на 2 части SC+RIPT, как и нужно писать в JS.@почему так "SC+RIPT"? Это чтобы не сработало как ключевое слово?Тоесть если эту функцию вставить в форум, то не один скрипт не будет работать? А если убрать разбиение, получается, что можно будет воткнуть любую свою функцию?
Неизвестный
14.12.2006, 09:46
общий
Дело в том, что мы разбиваем не "ключевое слово", а только строковую константу JS. И функция эта поддерживает синтаксис не JS, а СТРОК JS которые Вы должны заключать в кавычки, на работу скрипта это никак не повлияет.А в строках JS тег скрипта надо разбивать потому, что когда парсер HTML парсит страницу и встречает открывающий тег SCRIPTа, он начинает искать закрывающий тег, и ищет он его по правилам HTML, а не JavaScript, ему все равно в кавычках этот тег(т.е. просто текст константа) или действительно конец скрипта. А JavaScript просто складывает SC+RIPT и нормально работает.
Неизвестный
14.12.2006, 10:07
общий
Спасибо. Понял. Я раньше не знал, что такое нужно предусматривать.Кстати если заслешиваются символы после160, то сюда попадают русские буквы, что может очень сильно повлиять на размер. Нельзя ли как-нибудь это отключить? Или лучше придумать что-нибудь другое для кирилицы?
Неизвестный
14.12.2006, 10:28
общий
Символы будут заслешиватся только те, которые мы указываем во втором параметре addcslashes, посмотрите HTML source, там где строки выводятся случайно, там есть символы с кодом от 1 до 255, и видно какие символы слешаться, а какие нет.p/sstr_ireplace есть только для PHP 5, для ранней версии можно использовать eregi_replace
Неизвестный
14.12.2006, 10:42
общий
Я не внимательно прочел. Не заслешиваются, а преобразуются в восьмеричный код. Немного выше так и написано@символы с ASCII менее 32 и более 126 преобразуются в восьмеричное представление.@Я имел в виду именно это преобразование в восьмеричное 126 и больше содержит русские буквы и спецсимволы.К сожалению у моего хостера именно php4. Тоесть я оставляю всё так же, только заменяю strireplace на eregi_replace? Или RegExp дребует ещё добавлений, (я с ним не знаком)?
Неизвестный
14.12.2006, 11:00
общий
И в цифру будут преобразовываться только те символы, которые мы укажем.параметры eregi_replace такие же как у str_ireplacestring eregi_replace ( string pattern, string replacement, string string ),в простейшем случае(как у нас) pattern может быть обычной строкой, то есть можно все оставить так же:function php2js($s,$q2=true) { $q=($q2?‘"‘:"‘"); return eregi_replace(‘script‘, $q.‘+‘.$q.‘sc‘.$q.‘+‘.$q.‘ript‘, addcslashes($s,"\\\n\r\t".$q)); }
Форма ответа