PHP и DOMDocument - loadHTML заставляет текст исчезать после знака <

0

У меня этот html в строке:

$html = '<obj><p>Figure 1. different (<italic>p</italic>< 0.05).</p></obj>';

Затем я загружаю это в domDocument:

$doc  = new DOMDocument("1.0","UTF-8");
@$doc->loadHTML($html);

Затем, когда я сбрасываю содержимое domDocument:

var_dump($doc->saveHTML());

Я осознаю:

<html><body><obj><p>Figure 1. different (<italic>p</italic></p></obj></body></html>

Итак, знак <и остальные исчезли.

Любая идея почему?

Спасибо.

Теги:
domdocument

3 ответа

1
Лучший ответ

Это будет печатать как xml

header("Content-type: text/xml; charset=utf-8");
$html = '<obj><p>Figure 1. different (<italic>p</italic>'.    htmlspecialchars('< 0.05).') .'</p></obj>';

// Or else if you need this, then uncomment below line

//$html = htmlspecialchars('<obj><p>Figure 1. different (<italic>p</italic>< 0.05).</p></obj>');
$doc  = new DOMDocument("1.0","UTF-8");
@$doc->loadHTML($html);
echo ($doc->saveHTML());
  • 0
    Спасибо, но куда пропал <знак?
  • 0
    @ Milos, обновлено, дайте мне знать, если это помогает правильно.
Показать ещё 3 комментария
1

Ну, что < используется разметкой html, поэтому строка html, которую вы публикуете, интерпретируется браузерами как html.

Если вы хотите показать литеральную разметку html, вам придется сбежать от нее или пометить ее как предварительно отформатированный текст в явном виде::

echo "<pre>\n";
var_dump($doc->saveHTML());
echo </pre\n";

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

$html = '<obj><p>Figure 1. different (<italic>p</italic>&lt; 0.05).</p></obj>';
var_dump($html);
  • 0
    Спасибо @arkascha, но как конвертировать только те символы, которые не являются тегами html, например, если я использую htmlspecialchars (), он также преобразует <и> из курсива и т.д ...
  • 1
    Да это правда. Причина та же, почему браузер не может изменить ситуацию. Нет никакой разницы, чтобы отличать их друг от друга. Ошибка была сделана раньше: при создании строки, которая смешивает HTML-разметку и «зарезервированные» символы. Эти символы ( < здесь) должны быть экранированы при вставке в строку разметки. Теперь у вас есть «неверная» строка. Обычно такие строки создаются с использованием конструкций sprintf или аналогичных. Вот где должен произойти экранирование: экранировать все, что не является частью разметки (не только отдельные символы).
1

Парсер считает, что вы открываете новый тег HTML. Попробуйте использовать &lt; вместо.

$html = '<obj><p>Figure 1. different (<italic>p</italic>&lt; 0.05).</p></obj>';
  • 0
    Спасибо, но как преобразовать только <, что является нижним знаком, а не <из курсивного тега? Это должен быть общий метод
  • 0
    Вы путаете язык разметки (html) с контентом. Если у вас есть только контент, вы можете использовать htmlspecialchars() . Это скорее практическое неудобство. Вы также можете сделать что-то вроде этого: $html = '<obj><p>Figure 1. different (<italic>p</italic>' . htmlspecialchars("< 0.05).") . '</p></obj>';

Ещё вопросы

Сообщество Overcoder
Наверх
Меню