Замените теги ‹pre› на ‹code›

Что мне нужно сделать, так это заменить все предварительные теги тегами кода.

Пример

<pre lang="php">
    echo "test";
</pre>
Becomes
<code>
    echo "test";
</code>
<pre lang="html4strict">
    <div id="test">Hello</div>
</pre>
Becomes
<code>
    <div id="test">Hello</div>
</code>

И так далее..

Функции DOM по умолчанию в php имеют много проблем из-за греческого текста внутри.
Я думаю, что Simple HTML DOM Parser — это то, что мне нужно, но я не могу понять, как сделать то, что я хочу.
Есть идеи?

ОБНОВЛЕНИЕ
Я перехожу на новую CMS, поэтому я пишу скрипт для форматирования всех сообщений в правильный формат перед вставкой в ​​БД. Я не могу использовать предварительные теги в новой CMS.


person Jim    schedule 04.05.2012    source источник
comment
вы знаете, что можете стилизовать pre как угодно с помощью css, возможно, вам не придется его заменять   -  person ori    schedule 04.05.2012
comment
Вы не должны вносить изменения, чтобы у вас было <div> внутри <code>. Блочные элементы не могут находиться внутри встроенных элементов, и разные браузеры по-разному обрабатывают такие ошибки. Тем не менее, вы делаете все возможное, чтобы удалить плохие языки.   -  person Mr Lister    schedule 04.05.2012


Ответы (3)


Почему бы не KISS (Keep It Simple, Stupid):

echo str_replace(
    array('<pre>', '</pre>'),
    array('<code>', '</code>'),
    $your_html_with_pre_tags
);
person adrien    schedule 04.05.2012
comment
Я думаю, что люди не рекомендуют использовать str_replace и регулярное выражение для разбора большого html. Я ошибаюсь? - person Jim; 04.05.2012
comment
Я могу гарантировать вам, что это будет быстрее, чем версия simplehtmldom! - person adrien; 04.05.2012
comment
Вы также забыли, что ‹pre› не соответствует. Это ‹pre lang=что-то› - person Jim; 04.05.2012
comment
Да, когда я ответил, в вопросе не было образца HTML. Вы можете использовать регулярное выражение, но я не буду его рекомендовать. Есть ли в вашем HTML много разных значений для lang? Если это всегда «php» или «html», вы должны сохранить решение str_replace - person adrien; 04.05.2012
comment
Как я уже сказал, я предполагаю, что список языков известен и его легко получить. - person adrien; 04.05.2012

Посмотрите руководство. Изменение тегов <pre> на <code> должно быть таким же простым, как:

$str = '<pre lang="php">
    echo "test";
</pre>
<pre lang="html4strict">
    <div id="test">Hello</div>
</pre>';
require_once("simplehtmldom/simple_html_dom.php");
$html = str_get_html($str);
foreach($html->find("pre") as $pre) {
    $pre->tag = "code";
    $pre->lang = null; // remove lang attribute?
}
echo $html->outertext;

// <code>
//     echo "test";
// </code>
// <code>
//     <div id="test">Hello</div>
// </code>

PS: вы должны кодировать символы ", < и > при вводе.

person Salman A    schedule 04.05.2012
comment
В итоге я использовал как ваш пример, так и str_replace сверху. Спасибо - person Jim; 04.05.2012

Простая замена тегов pre на теги code существенно меняет смысл и визуализацию и делает разметку недействительной, если внутри элемента есть какие-либо элементы блочного уровня, такие как div. Поэтому вам нужно пересмотреть свою цель. Проверьте, можете ли вы продолжать использовать pre. Если нет, используйте вместо этого <div class=pre> вместе с таблицей стилей, которая заставляет его вести себя как pre при рендеринге. Когда вы просто заменяете теги pre на теги div, вы не будете создавать синтаксические ошибки (модель контента div допускает все, что позволяет pre, и даже больше).

Что касается атрибута lang, то lang="php" неверен (согласно спецификациям HTML атрибут lang указывает человеческий язык содержимого с использованием стандартных языковых кодов), но идея кодирования информации о компьютерном языке хороша. Позже это может помочь в стилизации и написании сценариев. В черновиках HTML5 упоминается, что такая информация может быть закодирована с использованием имени класса, начинающегося с language-, например. class="language-php"' (or, when combined with another class name,class="язык-php предварительно"'.

person Jukka K. Korpela    schedule 04.05.2012