При использовании PHP Simple HTML DOM Parser, нормально ли, что строка разбивает теги
, удаляются?
Сохранение разрывов строк - простой HTML DOM Parser
Ответ 1
Я знаю, что это старо, но я тоже искал это, и понял, что на самом деле есть встроенная опция, чтобы отключить удаление разрывов строк. Нет необходимости редактировать источник.
Функция PHP Simple HTML Dom Parser load
поддерживает несколько полезных параметров:
load($str, $lowercase=true, $stripRN=false, $defaultBRText=DEFAULT_BR_TEXT)
При вызове функции load
просто передайте false
в качестве третьего параметра.
$html = new simple_html_dom();
$html->load("<html><head></head><body>stuff</body></html>", true, false);
Если используется file_get_html
, это девятый параметр.
file_get_html($url, $use_include_path = false, $context=null, $offset = -1, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT)
Изменить: Для str_get_html
, это пятый параметр (Спасибо yitwail)
str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
Ответ 2
Также боролся с этим, так как мне нужно, чтобы HTML был легко доступен для редактирования после обработки.
По-видимому, существует логическое значение в SimpleHTMLDOM
script $stripRN
, которое по умолчанию установлено на true
. Он разбивает теги \r
, \n
или \r\n
в HTML.
Установите var в false
(несколько входов в script..), и ваша проблема решена.
Ответ 3
Вам не нужно изменять все $stripRN
на false, единственное, что влияет на это поведение, - на строку 816 ``:
// load html from string
function load($str, $lowercase=true, $stripRN=false, $defaultBRText=DEFAULT_BR_TEXT) {
Также рассмотрите возможность изменения строки 988, поскольку многобайтовые функции часто не устанавливаются на машинах, которые не имеют отношения к не-западно-европейским языкам. Исходная строка в версии 1.5 немедленно прерывает script:
if (function_exists('mb_detect_encoding')) { $charset = mb_detect_encoding($this->root->plaintext . "ascii", $encoding_list = array( "UTF-8", "CP1252" ) ); } else $charset === false;
Ответ 4
Если вы проходили мимо здесь, задаваясь вопросом, можете ли вы сделать то же самое в DomDocument, тогда я могу сказать, что вы можете! - но это немного грязно: (
У меня был фрагмент кода, который я хотел бы привести в порядок, но сохранил точные разрывы строк, которые он содержал (\n). Это то, что я сделал....
// NOTE: If you're HTML isn't a full HTML document then expect DomDocument to
// start creating its own DOCTYPE, head and body tags.
// Convert \n into a pretend tag
$myContent = preg_replace("/[\n]/","<img src=\"slashN\" />",$myContent);
// Do your DOM stuff...
$dom = new DOMDocument;
$dom->loadHTML($myContent);
$dom->formatOutput = true;
$myContent = $dom->saveHTML();
// Remove the \n that DOMDocument put in itself
$myContent = preg_replace("/[\n]/","",$myContent);
// Put my own \n back
$myContent = preg_replace("/<img src=\"slashN\" \/>/i","\n",$myContent);
Важно отметить, что я знаю, без тени сомнения, что мой ввод содержал только \n. Возможно, вам понадобятся ваши собственные варианты, если нужно учитывать учетную запись \r\n или\t. например, slash.T или slash.RN и т.д.
Ответ 5
Другим вариантом является сохранение другого форматирования, такого как абзацы и заголовки, для использования innertext
, а не plaintext
, а затем выполнить собственную очистку строки с результатом.
Я понимаю, что есть удар производительности, но он позволяет более детально управлять.