Jump to content
  • 0

HTMLSPECIALCHARS обрабатывает только отдельную часть текста


selevit
 Share

Question

Всем доброго времени суток, есть админка, в ней добавляются статьи, в которых присутствует исходный код, который заключен в теги pre, проблема в том, что приходится писать элементы кода типа <, > и т.п. специальными символами типа < и >. Скажите, как сделать так, чтобы все, что находится в теге pre обрабатывалось функцией htmlspecialchars, а остальной код оставался бы без обработки. Заранее спасибо.

Edited by selevit
Link to comment
Share on other sites

Recommended Posts

  • 0

Int, мне не нужно преобразовывать <> в [], мне нужно только чтобы из всего текста обрабатывалась только та часть, которая заключена в теги pre, спасибо за поддержку, но ни первый ни второй код не робит =)

Link to comment
Share on other sites

  • 0

Veseloff, спасибо большое! я с регулярными выражениями не дружу, поэтому такой вопрос - если тег pre имеет класс, например <pre class="code">, как должно выглядеть регулярное выражение? Заранее спасибо. =)

Link to comment
Share on other sites

  • 0

<pre[^>]*class=[\'\"][^\'\">]*code[^\'\">]*[\'\"][^>]*>(.*)</pre>

Как-то так. Совем не идеально, но мне лень думать. Вообще я бы рекомендовал воспользоваться специальным тегом <code>, который и предназначен как раз для вывода кода.

Link to comment
Share on other sites

  • 0

Эээ! не так

preg_replace_callback вам нужен.

я-то думал, что весь текст в pre, а если тольку кусок текста, то это да, регуляркой цопнуть.

Сейчас попытаюсь

function specchars($repl) {return htmlspecialchars($repl[1],ENT_QUOTES);}
echo preg_replace_callback('#<pre>(.+)</pre>#is','specchars',$text);

Можно и .* написать, как выше, но зачем обрабатывать пустые <pre></pre>?

Link to comment
Share on other sites

  • 0
Спасибо, не знал про такой тег =) Еще вопрос - как сформировать запрос к базе, чтобы он все записи <pre> в таблице поменял на <code>?

Есть же гугл, который подскажет как надо делать, если в него ввести запрос: «string replace mysql»

UPDATE `tablename` SET `fieldname`=REPLACE(`fieldname`, '<pre>', '<code>');
UPDATE `tablename` SET `fieldname`=REPLACE(`fieldname`, '</pre>', '</code>');

Эээ! не так

preg_replace_callback вам нужен.

я-то думал, что весь текст в pre, а если тольку кусок текста, то это да, регуляркой цопнуть.

Сейчас попытаюсь

function specchars($repl) {return htmlspecialchars($repl[1],ENT_QUOTES);}
echo preg_replace_callback('#<pre>(.+)</pre>#is','specchars',$text);

Можно и .* написать, как выше, но зачем обрабатывать пустые <pre></pre>?

А в чём профит такого подхода? По мне так preg_match с модификатором «e» нормально выполняет эту задачу. И функцию дополнительную не надо описывать.

Link to comment
Share on other sites

  • 0
Тьфу, опечатался. Туплю под вечер.

preg_replace('~<pre>(.*)<\/pre>~isUe', "htmlspecialchars('$1')", $text);

Этот код работает, но при обработке текста ставит лишний слеш к кавычкам, к примеру такое выражение, как <script type="text/javascript"> он преобразует в <script type=\\"text/javascript\\">, и при каждой обработке добавляет лишние слеши.

Link to comment
Share on other sites

  • 0

Нет, вы ошибаетесь. Никаких кавычек код не добавляет. Предположу, что добавление бэкслэшей происходит при сабмите формы.

Чё-то я e не заметил.

А ещё не match, а replace, потому что e не для match.

Да, я написал, что затупил под вечер и попутал match и replace <_<

Link to comment
Share on other sites

  • 0
Нет, вы ошибаетесь. Никаких кавычек код не добавляет. Предположу, что добавление кавычек происходит при сабмите формы.

При самбите формы добавляется один слеш к каждой кавычке, а тут 2.

может стоит воспользоваться функцией stripslashes?

Добавил вот что

$text = preg_replace('~<code>(.*)<\/code>~isUe', "htmlspecialchars('$1')", $text);
$text = stripslashes($text);

теперь при обработке убираются теги <code></code>

c <pre> - тоже самое.

Link to comment
Share on other sites

  • 0

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

Добавил вот что

$text = preg_replace('~<code>(.*)<\/code>~isUe', "htmlspecialchars('$1')", $text);
$text = stripslashes($text);

теперь при обработке убираются теги <code></code>

c <pre> - тоже самое.

Link to comment
Share on other sites

  • 0
обычные кавычки - вот такие " "

Магические кавычки == magic quotes, за разъяснениями в гугль. А ещё лучше выложите код, который работает не так, как следует, а там уже видно будет.

Link to comment
Share on other sites

  • 0

Это не код, а какой-то непонятный кусок. Если его выполнить, он вообще ничего не выдаст. Вернее, выдаст «Undefined variable: text». Текстик хоть приложите что ли...

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy