Тема: По разному извлекаются тексты из БД в браузер и в файл редактирования

Свои тексты я пишу в Дримвиавере и когда мне необходимо ввести в текст элементы кода, то редактор заменяет некоторые элементы на их условные эквиваленты. Заношу весь текст в виде кода в БД через админку сайта, проверяю в баузере и вижу, что всё так как должно быть. Но если мне приходится редактировать этот же текст и я вытаскиваю его из БД в форму для редактирования, то уже вижу, что все условные обозначения заменились на их оригиналы и, естественно, при таком исходе получается, что мои фрагменты кода становятся невидимыми для браузера. Я пытался фрагменты кода заключать в теги pre и  code, не помогает. Вывод текста из БД в браузер и в форму редактиования осуществляется одними и теми же способами через printf и $myrow в нужное место. Почему есть разница в результате не понимаю. Научите, пожалуйста, делать нормальные листинги фрагментов кода. Возможно я просто не знаю этого так как я самоучка.
Спасибо

Chichaco

2

Re: По разному извлекаются тексты из БД в браузер и в файл редактирования

Без примера я не очень понял, но если надо вывести html код на странице в его исходном виде, то следует обязательно применять функцию кодирования htmlspecialchars().

print htmlspecialchars($string);

Re: По разному извлекаются тексты из БД в браузер и в файл редактирования

Вот отрывок текста:

Всё, текстовый документ создан.
Откройте его и напишите в нем следующий код:

<html>
<head>
<title>Моя первая страница в интернете</title>
</head>
<body>
<p>А это Мои первые слова на WEB-странице!</p>
</body>
</html>

Теперь сохраним наш файл: выбираем в меню блокнота "ФАЙЛ - СОХРАНИТЬ КАК", и в выпавшем окне сохраняем наш документ под каким либо именем, например, page.html. Обязательно в латинице и с расширением (после точки) html

Весь текст и то, что выделено жирным надо сохранить в таком же виде, но я не могу выделить жирную часть в отдельную строку. Если попытатья это сделать, то мне кажется, что это будет неоправдано сложным.
Текст надо сохранить в виде одной строки. Но если у вас есть какой-либо хитроумный способ, пожалуйста, поделитесь им.
Спасибо.

Chichaco

Re: По разному извлекаются тексты из БД в браузер и в файл редактирования

В догонку, Мне надо сделать также, как выглядит, приведённый мной отрывок текста, в предыдущем сообщении. Теперь, мне кажется, всё наглядно. Может быть это очень просто, но я этого не знаю.
Спасибо.

Chichaco

5

Re: По разному извлекаются тексты из БД в браузер и в файл редактирования

Юрий Иванович сказал:

Текст надо сохранить в виде одной строки.

Текст сохранить в базе данных? Если да, то не вижу совершенно никаких проблем.

Если данный текст надо вывести из БД, то я уже упомянул функцию htmlspecialchars(), которую и надо использовать.

6 (изменено: DmitryV, 2011-02-23 23:30:25)

Re: По разному извлекаются тексты из БД в браузер и в файл редактирования

текст вида:
<html>
<head>
<title>Моя первая страница в интернете</title>
</head>
<body>
<p>А это Мои первые слова на WEB-странице!</p>
</body>
</html>

заменить на:

&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Моя первая страница в интернете&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;А это Мои первые слова на WEB-странице!!&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;

Re: По разному извлекаются тексты из БД в браузер и в файл редактирования

DmitryV сказал:

текст вида:
заменить на:

&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Моя первая страница в интернете&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;p&gt;А это Мои первые слова на WEB-странице!!&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;

Всё это я делаю и сохраняю в БД в таком виде, но когда я извлекаю из БД в форму ( в textarea) , то все обозначения типа &lt; заменяются на их оригиналы, а при извлечении того же текста из БД в баузер всё происходит правильно.
А htmlspecialchars(), обработает всё, и нужное и не нужное, мне так кажется. Я же сохраняю в БД код с обыкновенными тегами, которые не надо преобразовывать и уже преобразованные мной теги, которые затем непонятным мне образом превращаются снова в обычные теги. Вот в этом то и есть моя проблема.
Спасибо.

Chichaco

8

Re: По разному извлекаются тексты из БД в браузер и в файл редактирования

В textarea сущности вида &lt; обязательно будут преобразованы в соответствующие символы, поэтому для textarea символ < в виде сущности будет выглядеть так (&amp;lt;), то есть нужна двойная кодировка.

Если есть текст к которому нельзя применять функцию htmlspecialchars() и в нем же есть текст для которого эта кодировка обязательна, то лучше подумать над разделением этих блоков текста, иначе потребуется мучительная кодировка символов вручную.

Re: По разному извлекаются тексты из БД в браузер и в файл редактирования

Hanut сказал:

В textarea сущности вида &lt; обязательно будут преобразованы в соответствующие символы, поэтому для textarea символ < в виде сущности будет выглядеть так (&amp;lt;), то есть нужна двойная кодировка.

Если есть текст к которому нельзя применять функцию htmlspecialchars() и в нем же есть текст для которого эта кодировка обязательна, то лучше подумать над разделением этих блоков текста, иначе потребуется мучительная кодировка символов вручную.

Спасибо. ??? Я в растеренности. Что почитать? Посоветуйте.

Chichaco

10

Re: По разному извлекаются тексты из БД в браузер и в файл редактирования

На счет почитать - даже не знаю что сказать.

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

Как вариант, можно использовать подобие BBCode, и применить к такому тексту поиск по регулярному выражению с выполнением функции обратного вызова. Звучит может и сложно, но на самом деле выглядит так.

<?php

function encode_html($matches) {
  return htmlspecialchars(htmlspecialchars($matches[1]));
}

$str = 'текст
[htmlspecialchars]
<html></html>
[/htmlspecialchars]
текст';

echo preg_replace_callback('/\[htmlspecialchars\](.*?)\[\/htmlspecialchars\]/is', 'encode_html', $str);

?>

Re: По разному извлекаются тексты из БД в браузер и в файл редактирования

Hanut сказал:

На счет почитать - даже не знаю что сказать.

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

Как вариант, можно использовать подобие BBCode, и применить к такому тексту поиск по регулярному выражению с выполнением функции обратного вызова. Звучит может и сложно, но на самом деле выглядит так.

<?php

function encode_html($matches) {
  return htmlspecialchars(htmlspecialchars($matches[1]));
}

$str = 'текст
[htmlspecialchars]
<html></html>
[/htmlspecialchars]
текст';

echo preg_replace_callback('/\[htmlspecialchars\](.*?)\[\/htmlspecialchars\]/is', 'encode_html', $str);

?>

Спасибо, попробую разобраться.

Chichaco