Преобразовать строку в HTML код (обратное htmlspecialchars из php)
В переменной текст. В этом тексте ВСЕ спецсимволы из HTML заменены таким образом:
'<' = < '>' = > и другие символы заменены на свои "соответствия" в том числе. Из-за этого весь HTML код превращается в текст в то время, когда он должен быть HTML кодом. Можно ли как-то javascript'ом преобразовать HTML сущности в спецсимволы. (операция обратная php htmlspecialchars) Вот такой текст в переменной: <HTML><body>\\n <!DOCTYPE HTML PUBLIC \'-//W3C//DTD HTML 4.01 Transitional//EN\'>\\n <meta http-equiv=\'content-type\' content=\'text/html; charset=utf-8\'> <link href=\'http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/styles/shCore.css\' rel=\'stylesheet\' type=\'text/css\'/> <link href=\'http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/styles/shThemeDefault.css\' rel=\'stylesheet\' type=\'text/css\'/> <script src=\'http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/scripts/shCore.js\' type=\'text/javascript\'></script> <script src=\'http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/scripts/shBrushCpp.js\' type=\'text/javascript\'></script> <script language=\'javascript\'> SyntaxHighlighter.all(); </script> <!----------------КОД-----------------------------> <pre class=\'brush: cpp\'> #include &lt;iostream&gt; <br /> using namespace std; int main(){ setlocale(LC_ALL,&quot;&quot;); int Height,Weight; cout&lt;&lt;&quot;Введите Ваш рост и вес:\\n&quot;; cin&gt;&gt;Height&gt;&gt;Weight; cout&lt;&lt;&quot;Ваш рост: &quot;&lt;&lt;Height&lt;&lt;endl; cout&lt;&lt;&quot;Ваш вес: &quot;&lt;&lt;Weight&lt;&lt;endl; } </pre> <!----------------КОД-----------------------------> </body></HTML> Должен предстать не в виде текста, а в виде кода HTML со своими тегами, а не сущностями вместо тегов. |
можно попробовать это - http://phpjs.org/functions/htmlspecialchars_decode/
function htmlspecialchars_decode(string, quote_style) { var optTemp = 0, i = 0, noquotes = false; if (typeof quote_style === 'undefined') { quote_style = 2; } string = string.toString() .replace(/</g, '<') .replace(/>/g, '>'); var OPTS = { 'ENT_NOQUOTES': 0, 'ENT_HTML_QUOTE_SINGLE': 1, 'ENT_HTML_QUOTE_DOUBLE': 2, 'ENT_COMPAT': 2, 'ENT_QUOTES': 3, 'ENT_IGNORE': 4 }; if (quote_style === 0) { noquotes = true; } if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags quote_style = [].concat(quote_style); for (i = 0; i < quote_style.length; i++) { // Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4 if (OPTS[quote_style[i]] === 0) { noquotes = true; } else if (OPTS[quote_style[i]]) { optTemp = optTemp | OPTS[quote_style[i]]; } } quote_style = optTemp; } if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) { string = string.replace(/�*39;/g, "'"); // PHP doesn't currently escape if more than one 0, but it should // string = string.replace(/'|�*27;/g, "'"); // This would also be useful here, but not a part of PHP } if (!noquotes) { string = string.replace(/"/g, '"'); } // Put this in last place to avoid escape being double-decoded string = string.replace(/&/g, '&'); return string; } |
А зачем тогда преобразуется при выводе?
|
Цитата:
|
Цитата:
|
Цитата:
Этот пример я попозже попробую. |
Цитата:
|
С помощью php я беру текст из файла. Этот текст - это HTML код, в котором описан некоторый язык программирования (в моем случае c++)/ там маленький пример. Этот HTML код должен стать HTML страницей. Проще говоря, средствами javascript я открываю новое окно, в которое вписываю этот HTML код, который с помощью php беру из файла.
Если HTML не преобразовывать в php, то часть исходного HTML затрется, а это уже приведет к тому, что в переменной javascript окажется непонятно что. Чтобы javascript проглотил этот текст, приходится экранировать символы и HTML превращать в HTML сущности, но из-за этого в открываемом окне страница выглядит не как HTML страница, а как текст. Я могу дать исходный HTML код. Если он нужен. И еще у меня такая проблема, что даже если вышеприведенный код мне поможет, он убьет часть кода, где > и некоторые символы изначально являются не HTML кодом, а HTML сущностями. (я об этом забыл вначале написать). |
В смысле исходный - это тот, который сначала редактируется, чтобы в переменную javascript попало, что надо. А потом обратная операция нужна, насколько я понял.
|
Цитата:
|
Если непонятно. Я опишу задачу в более полной форме. Я сразу могу сказать, что javascript я совсем не знаю, поэтому я не могу оценить насколько трудна эта задача. Но решение для меня очень желательно.
Такое ощущение, что мы как в разных странах живем и через переводчик общаемся' ) |
Цитата:
Вот смотрите. Есть файл. В файле обычный HTML код. Вот он этот код. <HTML><body>\n <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'>\n <meta http-equiv='content-type' content='text/html; charset=utf-8'> <link href='http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/styles/shCore.css' rel='stylesheet' type='text/css'/> <link href='http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/> <script src='http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/scripts/shCore.js' type='text/javascript'></script> <script src='http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/scripts/shBrushCpp.js' type='text/javascript'></script> <script language='javascript'> SyntaxHighlighter.all(); </script> <!----------------КОД-----------------------------> <pre class='brush: cpp'> #include <iostream> <br /> using namespace std; int main(){ setlocale(LC_ALL,""); int Height,Weight; cout<<"Введите Ваш рост и вес:\n"; cin>>Height>>Weight; cout<<"Ваш рост: "<<Height<<endl; cout<<"Ваш вес: "<<Weight<<endl; } </pre> <!----------------КОД-----------------------------> </body></HTML> Файл с этим кодом хранится на сервере, следовательно, чтобы его получить, я использую php, а из php уже отдаю в javascript. Если я не экранирую символы и не преобразую HTML в HTML сущности, то этот код в итог ломается и уже когда выполняется javascript у меня нефига не работает. А если я преобразую, то я на выходе получаю вот такой HTML код <HTML><body>\\n <!DOCTYPE HTML PUBLIC \'-//W3C//DTD HTML 4.01 Transitional//EN\'>\\n <meta http-equiv=\'content-type\' content=\'text/html; charset=utf-8\'> <link href=\'http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/styles/shCore.css\' rel=\'stylesheet\' type=\'text/css\'/> <link href=\'http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/styles/shThemeDefault.css\' rel=\'stylesheet\' type=\'text/css\'/> <script src=\'http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/scripts/shCore.js\' type=\'text/javascript\'></script> <script src=\'http://ci-plus-plus-snachala.ru/syntaxhighlighter_3.0.83/scripts/shBrushCpp.js\' type=\'text/javascript\'></script> <script language=\'javascript\'> SyntaxHighlighter.all(); </script> <!----------------КОД-----------------------------> <pre class=\'brush: cpp\'> #include &lt;iostream&gt; <br /> using namespace std; int main(){ setlocale(LC_ALL,&quot;&quot;); int Height,Weight; cout&lt;&lt;&quot;Введите Ваш рост и вес:\\n&quot;; cin&gt;&gt;Height&gt;&gt;Weight; cout&lt;&lt;&quot;Ваш рост: &quot;&lt;&lt;Height&lt;&lt;endl; cout&lt;&lt;&quot;Ваш вес: &quot;&lt;&lt;Weight&lt;&lt;endl; } </pre> <!----------------КОД-----------------------------> </body></HTML>На клиенте я открываю новое окно и вписываю этот код в это окно, но из-за предыдущих преобразований получается, что это текст в виде HTML кода, а мне нужно, чтобы это получилась страничка с исходным HTML кодом. (тот, что выше).При этом должна сработать подсветка кода. |
В смысле, я при некотором действии пользователя открываю окно, в которое должен вписаться изначальный текст, взятый с файла, который хранится на сервере'
|
<HTML><body>
<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'> <meta http-equiv='content-type' content='text/html; charset=utf-8'> ...... Это html-код страницы. Зачем его преобразовывать? using namespace std; int main(){ setlocale(LC_ALL,""); int Height,Weight; cout<<"Введите Ваш рост и вес:\n"; cin>>Height>>Weight; cout<<"Ваш вес: "<<Weight<<endl; ..... Это описание кода и необходимое уже преобразовано в html-сущности. Зачем к этому раз применять ко всему содержимому htmlspecialchars? |
Цитата:
То, что внутри комментариев <!--Код--> к HTML коду отношения не имеет. Это изначально HTML сущности, это изначально угловые скобки, кавычки и другие элементы текста, но это так только между комментариями <!--Код-->/ Хотя даже в нем есть элементы, которые преобразованы в HTML сущности... это плохо. _________________ Применять затем, что без применения при вставке переменной php в переменную javascript, без подобной редактуры текста у меня ВСЁ, абсолютно ВСЁ не работает. |
Вы понимаете назначение функции htmlspecialchars? Думаю что да.
Остается понять кто автор данных описаний - если вы, то неужели трудно определиться что должно на странице быть описанием, а что его представлять? Если не вы, то почему разрешается такой "винегрет", а не храниться описание отдельно, к которому только при выводе нужно применять htmlspecialchars? |
Я знаю что она делает и зачем она нужна.
Терминология "описаний" мне непонятна. Открытое на клиенте окно с вписанным в него текстом должно стать HTML страницей, той самой HTML страницей, которая хранится на сервере. |
Вставляйте в чем проблема? Зачем вы ее пропускаете через htmlspecialchars, ведь код описания уже преобразован?
|
Вот текст исходной страницы.
<?php $arr[] = str_replace('</script>','</s" + "cript>',htmlspecialchars(addslashes(file_get_contents("MyFiles/MyFile.php")))); ?> <script type='text/javascript' > function MyFunc(S){ var NewWin=window.open('','','...'); NewWin.document.write(S); } </script> <div id="id2" > <b>Кликни меня</b><br /> <script type='text/javascript'> document.getElementById("id2").onclick = MyFunc.bind(null,<?php echo json_encode($arr[0]); ?>); </script> </div> С помощью php я записываю текст из файла в ячейку массива. Т.к. тупо записать без экранирования+htmlspecialchars у меня не вышло, мне подсказали использовать экранирование и htmlspecialchars. Дальше при клике по элементу <div>, должно открыться окно, в которое должен вписаться текст из файла, вписаться он должен как HTML код. Если все правильно, то пользователь, кликнувший по <div>, должен получить открытое окно, которое будет чем-то типа зеркального отражения файла с сервера, даже не файла, а полноценной HTML странички. Т.е. это такая вот передача текстовых данных с сервера в открываемое окно у клиента. |
Проблема в том, что если не преобразовывать HTML код в HTML сущности, то при передаче текстовых данных в массив возникают непонятные мне проблемы. А если преобразовывать, то я получаю не отражение HTML страницы, а отражение ее кода.
|
Цитата:
|
Много файлов, в каждом файле свой код. Окно открывается одно. Т.к. файлов много, то удобно записывать их в массив, а потом передавать в открываемое окно.
В результате, в зависимости от выбранного пользователем <div> элемента, в открытое окно должен вписаться соответствующий этому <div> текст, который в свою очередь и хранится на сервере. Массив или переменная не одно ли и то же?. Массив всего лишь хранит много переменных, но его переменная, это обычная переменная, ничем от других переменных не отличающаяся. |
Нужно отделять мух от котлет, иначе у вас слишком много бесполезной работы.
1) Кто хозяин этих описаний? 2) Ваш сайт динамический или статический? |
а загрузить аяксом нужную страницу не пробовали?
|
Задача моя. Ставил себе её я сам. Решение мне действительно нужно.
В Javascript я ничего не знаю. Я в этом признался честно и повторяю сейчас. Кусочек с php писал я. C экранированием и html сущностями мне подсказали. javascript под открытия окна писал я. Искал как делать много, долго и упорно. Настоящего автора сказать не могу. Я не знаю кто это был, я использовал его труд. То же самое для клика по <div>, автора сказать не могу, но выискал я своими силами. HTML код написан мной. Подход к решению выбран мной с некоторыми корректировками другими людьми. __________________ И кто здесь автор описаний? Вроде не я, а вроде и я с некоторой помощью других людей. __________________ |
Я не знаю Аякса. Если в javascript я хотя бы document.write знаю, то там не знаю ничего. И скорее всего там будет эта же проблема, что сейчас стоит передо мной.
|
Сейчас я быстро отвечать не могу, я отхожу от компа. Вечером вернусь. Часов в 23.00 по Москве...
И все-таки очень надеюсь, что решение найти поможете. Как-никак, отвечаете мне. Но надеюсь, что допросы прекратятся, если кому нужно слишком много деталей, готов показать своими глазами, что мне нужно, что у меня есть и что у меня не получается (с помощью teamviewer). Это займет намного меньше времени, чем писать ответы на все тонкости, колкости и проверку на "халявщика". сейчас отхожу от компа. |
Цитата:
Если же все будет на севере организовано надлежащим образом, то запрос каждого описания, это полученное из базы через htmlspecialchars(), и вставленное в один и тот же шаблон html-кода. А какое описание запрашивается, а значит и вставляется, определяется параметром запроса в url для window.open(), а не получается из какого-то массива, который вообще не нужен. Впрочем как хотите, но что-то советовать не зная всего трудно, и если это для вас "допрос"... ну значит майтесь с массивами и прочим. |
Когда-прийдете - попробуйте это
<script type='text/javascript' > function MyFunc(url){ var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.send(); xhr.onreadystatechange = function() { if (xhr.readyState != 4) return; if (xhr.status != 200) { alert('Ошибка: ' + xhr.status + '|' + xhr.statusText); } else { var NewWin=window.open('','','...'); NewWin.document.write(xhr.responseText); // xhr.responseText - переменная в которой хранится нужный текст } } } // вызывать функцию так - MyFunc('MyFiles/MyFile.php') </script> <div id="id2" > <b>Кликни меня</b><br /> <script type='text/javascript'> document.getElementById("id2").onclick = MyFunc("<?php echo $url ?>"); // $url - нужный адрес, например у вас - "MyFiles/MyFile.php" </script> </div> |
KosBeg,
Так ничего вообще не происходит. Даже окно не открывается. laimas, С базой, конечно, должно быть удобнее решать, но я не умею работать с бд в принципе. И я не знаю насколько удобно потом вносить правки во все файлы максимально быстро. Да и само обращение к файлам работает быстрее чем обращение к бд. Так-то если надо отдельный файл попраивть или массово что-то там дописать/изменить, то я могу себе что-то свое написать несложное. Из-за 1 правки импортировать бд в пару десятков МБ) Немного забавно, но неудобно. Мой интернет не безлимитный, а безлимитный интернет у меня по географическому положению в принципе отсутствует и еще лет 200 не будет. Я в принципе не против решения с бд, но как я сказал, я не умею с ней работать программно. Сайт на Wordpress/ Что-то там портить в бд мне не хочется совсем. |
KosBeg,
Это же ajax? Я не очень в теме как его дружить с Wordpress. |
Цитата:
Цитата:
шутка, но с долей правды а если честно - ничего дружить не надо! просто заменяешь это http://javascript.ru/forum/misc/5783...tml#post385169 на тот код который я написал, он полность независим) правда со своими мини-правками(адрес подправить, може еще что-то) UPD: извиняюсь - не прочитал сразу... Цитата:
|
Скорее всего происходит то, из-за чего я экранировал символы и преобразовывал HTML в HTML сущности. Поэтому даже окно не открывается. Это то о чем я говорил, что, вероятно, будут те же "грабли".
|
хотя я вижу решение именно таким способом - то что нужно хранится в файле, и его загружают аяксом и вставляют в окно
|
Хоть убейте. У меня не дружат. Я как-то пробовал делать простые вещи на ajax, на чистом HTML локально получилось, а на Wordpress не заработало. (совсем простые примеры).
|
function MyFunc(url){ var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); xhr.send(); xhr.onreadystatechange = function() { if (xhr.readyState != 4) return; if (xhr.status != 200) { alert('Ошибка: ' + xhr.status + '|' + xhr.statusText); } else { alert('All is ok'); var NewWin=window.open('','','...'); NewWin.document.write(xhr.responseText); // xhr.responseText - переменная в которой хранится нужный текст } } } MyFunc('http://javascript.ru/forum/'); нажми у браузере f12 и введи в консоль этот код появится алетр('All is ok') откроется окно и будет там нужный текст))) косяк на твоей стороне... UPD: всем спокойной ночи, а спать :D |
Я подумывал без Аякса сначала преобразовать lдействительные, изначальные HTML сущности в HTML сущности с неким признаком, что они настоящие и их нужно выводить как HTML сущности, потом уже преобразовывать текст так, чтобы javascript его проглатывал, а потом уже пробовать раскодировать этот текст в нужный вид, используя пост2 (Ваш совет), а HTML сущности с признаком преобразовывать в HTML сущности, так как они изначально таковые.
Вот как-то так. Просто знаний нету как такое провернуть. |
Цитата:
Uncaught SyntaxError: Unexpected token < at Object.InjectedScript._evaluateOn (<anonymous>:905:140) at Object.InjectedScript._evaluateAndWrap (<anonymous>:838:34) at Object.InjectedScript.evaluate (<anonymous>:694:21) ___________ Снов. Я не задерживаю. |
Цитата:
Допросом я это назвал, потому что я терпеливо отвечаю на ваши вопросы больше чем на страницу и получаю все новые и новые порции вопросов, среди которых есть советы, часть из которых просто "не рабочие варианты", но больше вопросов "почему", "почему каша", "почему не бд", почему "файлы", "зачем преобразовываете","почему", "почему", "почему", "кто автор описаний".., "зачем массив", "какой у Вас сайт". ___________________ У меня сайт НЕ интерактивный, скорее статический, но с БД. CMS Wordpress. На сайте будут страницы, внутри страниц будут блоки с <div id="..">, клик по любому такому div должен открывать окно, в которое будет вписываться текст, который в свою очередь имеет некоторую связь с выбранным div. Я выбрал хранение в файлах, потому что импортировать файлы намного проще и быстрее чем импортирование всей бд при добавлении или редактировании файла и потому что обращение к файлам быстрее чем обращение к БД, т.е. даже грузится будет очень быстро. Т.к. я не могу javascript использовать для серверных файлов, я использую php, а так как файлов много, текст каждого из этого файла я записываю в массив в определенную ячейку. Это тоже самое, что записать этот текст в переменную. Дальше уже я этот текст отдаю клиенту, потому что открыть окно я могу только на клиенте. И что значит бездумно отдаю, я не очень понимаю. Я уже третий раз говорю. Я не знаю javascript. Я не знаю чем будет отличатся передача текста из памяти, которая что-то там хранит на сервере отличаться от передачи из бд. Вон сколько вопросов. |
Цитата:
Цитата:
|
Часовой пояс GMT +3, время: 04:42. |