Как убрать переносы и пробелы

Gorynych

Посетитель PHP-Клуба
Vallar_ultra скажем так - зависит от целей. Лично я использую эту функцию для преобразования перед отправкой в код клиентского скрипта. В неизвестный мне код, который должен отработать на стороне клиента и, возможно, будет так же делать какие-то преобразования строк.

не помню уже почему, но потеря кавычек и апострофа в какой-то момент показалась меньшим злом, чем последующие проблемы на стороне яваскрипта. Вроде и чуть некорректно к контексту, но надежнее.
 

Vallar_ultra

Любитель выпить :)
Gorynych
одно ни как не связанно с другим. Мешают пробелы - грохай. Кавычки за что?

Вот пример данных, когда это не валидно:
PHP:
$new_box = '<div style="border: 1px solid red;">АХТУНГ</div>';
echo jsString($new_box); 
// <div style=border: 1px solid red;>АХТУНГ</div> 
// аттрибут style убит. если страница xhtml - browser ругнется
 

Gorynych

Посетитель PHP-Клуба
Vallar_ultra пример интересный, а экранированный вывод, это будет что, вот это:
Код:
<div style=\"border: 1px solid red;\">
и это лучше?

еще раз скажу - функция предназначалась для преобразования строк, передаваемых в яваскрипт, а не для преобразования HTML-разметки перед выводом
 

Vallar_ultra

Любитель выпить :)
Gorynych
Что лучше:
element.innerHTML = ("<div style=\"border: 1px solid red;\">");
или
element.innerHTML = ("<div style=border: 1px solid red;>");
 

kruglov

Новичок
Что-то мне кажется, что функция эскейпинга JS-данных по функциональности должна быть довольно сильно похожа на [m]mysql_real_escape_string[/m]
 

Gorynych

Посетитель PHP-Клуба
kruglov может и да, я сейчас не вспомню, где именно наступил на граблю с попыткой экранировать кавычки. Что было связано с тем, что PHP поставлял строки, которые затем еще обрабатывались на явяскрипте и где-то что-то не сросталось.


Vallar_ultra и то и другое - ужасно, потому что прет стилевое описание непосредственно в атрибут HTML-тэга. Вариант же <div class=mydiv1>...</div> вполне работает без кавычек

но если Вам станет легче - можете изменить с учетом экранирования кавычек и, возможно, апострофов.
 

Vallar_ultra

Любитель выпить :)
Gorynych
><div class=mydiv1>...</div>

Мда.... Мысль о существовании XHTML и понятия WellFormated отвергается как еретическая ? =)

-~{}~ 20.04.07 14:55:

> потому что прет стилевое описание непосредственно в атрибут

ахренеть.... по вашему любой редактор аля FCK будет лазать в *.css и делать там нужные классы?
 

Gorynych

Посетитель PHP-Клуба
Vallar_ultra о чем мы спорим-то? Мысль о внедрении стилевого описания в HTML-разметку - да, отвергается, как еритическая и почитав не только о допустимых для переходного (Transitional)типа документа в HTML/XHTML вольнностях, Вы, возможно, поймете что строгий (Strict) формат настаивает на вынесении стилевых описаний в отдельные файлы стилевых описаний (они же - css), а не писания их в атрибут style.

интересно, а каким боком ваш-то пример с излишним экранированием попадает под стандарт XHTML и WellFormated? Вы уж оставайтесь в одном поле. А то к чужим результатам Вы подтягиваете "тяжелую артиллерию", в виде стандартов, но что-то мне подсказывает, что
Код:
<div style=\"border: 1px solid red;\">
как-то слабо им соответствует .

--
редакторы а-ля FCK вообще-то:

а) изначально были ориентированы на разметку а-ля Word (использовать размер шрифта и покрасить текст цветом), чем сильно мешают корректной логической разметке документа.

б) тот же FCK имеет инструменты для применения к редактируемому в нем тексту предопределенных стилей (разумеется, описанных в файле стилевых описаний), заместо "покрасить" и прочей word'овой атрибутики

--

Еще раз пытаюсь повторить ОДНО и ТОЖЕ: у функции есть область применения. Эта область задумывалась как преобразование текста в строку, которая передается в код клиентского скрипта как часть формируемой там строки (для включения в вывод алертов, комфирмов, строковых параметров и т.п.). Ключевой момент - это не задумывалось как функция для формирования HTML-разметки Вы разницу понимаете или Вы по прежнему уперлись в желание использовать все что угодно, где угодно?
 

Vallar_ultra

Любитель выпить :)
Gorynych
>для включения в вывод алертов, комфирмов, строковых параметров и т.п.

>это не задумывалось как функция для формирования HTML-разметки Вы разницу понимаете

Я понимаю. а вот у вас по-моему не все хорошо с этим. По вашему конструкция вида "element.innerHTML = ..." не может существовать по определению?

>интересно, а каким боком ваш-то пример с излишним экранированием попадает под стандарт XHTML и WellFormated? Вы уж оставайтесь в одном >поле. А то к чужим результатам Вы подтягиваете "тяжелую артиллерию", в виде стандартов, но что-то мне подсказывает, что

WellFormated - это не стандарт.

Еще раз: "функция предназначалась для преобразования строк, передаваемых в яваскрипт" - не я писал. и вы при этом упорно считаете что в яваскрипте стринг не может содержать кавычек, апострафов и прочее....

В каждом конкретном контексте можно применять либо транслирование, либо экранирование.

Вот вам кАнкретный usecase для вашей супер-функции: мне надо передать запрос на сервер через XmlHttpRequest и получить в ответ на него некий XHTML код. на серверной стороне, применяя ваше творение, я на выход отдам НЕ WellFormated документ. Вопрос на миллион: почему я буду применять вашу функцию для решения данной задачи?!
 

OZ

Новичок
Gorynych, не выдирай слова из контекста. Тебе Vallar_ultra написал
Код:
element.innerHTML = ("<div style=\"border: 1px solid red;\">");
а не так, как ты его процитировал:
Код:
<div style=\"border: 1px solid red;\">
- результат будет совсем другим, экранирования в первом случае не будет.
А вот за
Вариант же <div class=mydiv1>...</div> вполне работает
надо бить по голове распечатками стандарта XML.
 

maxru

МИФИст
Gorynych, прав. JS тут действительно не при чем. У меня была такая же трабла, когда я пытался делать "псевдоajax" с подгрузкой и внедрением средствами DOM яваскриптов (генерирующихся php скриптом). Решил так же - просто написал функцию для форматирования выдаваемого яваскрипта. И пробелы тут не при чем.
 

Gorynych

Посетитель PHP-Клуба
Vallar_ultra в чем Вы пытаетесь меня убедить? В том, что можно экранировать апостроф и кавычки при формировании на стороне PHP строкового литерала, предназначенного для подстановки в формируемый javascript-код? Или в чем?

я все время пытаюсь до Вас донести мысль о том, что функция писалась и используется с конкретной целью: сформировать на стороне PHP строковый литерал, который будет передан в формируемый javascript-код, где будет использован в виде значения строки (т.е., вероятнее всего окружен апострофами или кавычками - заранее неизвестно как именно).

Вы же почему-то решили, что я Вам тут пишу супер-мега решение, настаивая на том, чтобы Вы его использовали повсеместно и ежечасно.

да, можно поизвращаться с экранированием, но я уверен, что тупой вычистки достаточно для того, чтобы сформировался корректные данные для подстановки в формируемый ява-скрипт код, в котором эти данные могут быть окружены апострофами, кавычками, использоваться при формировании выражения и т.п. - мы не знаем чего.

и, пожалуйста, прекратите убеждать меня в том, почему эту функцию не надо использовать для формирования HTML. В том числе, я глубоко убежден, что на стороне PHP не должно быть места формированию кода разметки вида <div ...>...</div> или element.innerHTML = "<div ...>...</div>". Лично я глубоко убежден, что на стороне PHP может формироваться значения, подставляемые в атрибуты тэга (того же DIV'а), но сама разметка, конструкции уровня DOM И т.п. - это то, что должно находиться в коде HTML-шаблона и клиентского скрипта, а не формироваться в рамках PHP-скрипта.

да, я знаю, что практический каждый учебник содержит примеры смешения HTML-разметки с PHP-кодом и жуткие конструкции взаимовнедрения. Но это не значит, что так надо делать.

P.S. функция называется jsString. Подумайте о смысловой нагрузке, которое несет такое название. Поскольку мне надоело отвечать одно и тоже, на одни и те же примеры из другой оперы - останемся при своих.
 

kruglov

Новичок
Gorynych
Мммм, А в алерте я не могу захотеть кавычки использовать разве? И в несколько строчек писать?

Мне это напоминает рекомендации некоторых авторов удалять из получаемых и используемых в запросах к БД данных кавычки, апострофы, 1=1 и union.
 

Gorynych

Посетитель PHP-Клуба
kruglov ааа!!!
PHP:
$str = 'да, вы можете использовать несколько строк,
но только в случае, когда вы гарантировано уверены, 
что не нарушите структуру клиентского скрипта.

но если есть опасность нарушения - проще пожертвовать.

ИМХО';

echo sprintf("<script>alert('%s');</script>", $str);
echo sprintf("<script>alert('%s');</script>", preg_replace("/('|\"|\r?\n)/",' ',$str));
и, кстати, я не уверен, что все три основные линейки браузеров умеют воспринимать переводы строк и экранированные апострофы и кавычки. Но спорить дальше - отказываюсь. Мне с какого-то перепугу оказалось важным это вычищать года два назад. Но есть масса способов сделать иначе и по другому. Возможно - граблей и не будет. Мне лень сейчас проверять все это на совместимость с тремя линейками браузеров и возможностью использования при формировании параметров управляющих AJAX-элементов.
 

Sparton

Новичок
Gorynych
Спасибо за функцию! Решение очень подошло в моем случае, несмотря на вырезание кавычек и т.д. Спасибо!
 

joomproducer

Новичок
PHP:
echo sprintf("<script>alert('%s');</script>", preg_replace("/('|\"|\r?\n)/",' ',$str));
Спасибо!!! Сэкономил тучу времени ;)

Вот немного усовершенствованный вариант (javascript корректно показывает переносы строк):

PHP:
$str = nl2br($str);
$str  = preg_replace("/('|\"|\r?\n)/",' ',$str );
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Колективная археология?
 
Сверху