Сохранить разрывы строк - Простой HTML DOM Parser - PullRequest
23 голосов
/ 27 января 2011

При использовании PHP Simple HTML DOM Parser это нормально, что разрывы строк
теги удаляются?

Ответы [ 5 ]

54 голосов
/ 22 февраля 2012

Я знаю, что это старо, но я тоже искал это и понял, что на самом деле была встроенная опция, чтобы отключить удаление разрывов строк. Не нужно переходить к редактированию источника.

Функция PHP 100 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 это пятый параметр (Спасибо, спасибо)

str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
21 голосов
/ 29 сентября 2011

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

Очевидно, что в скрипте SimpleHTMLDOM $stripRN есть логическое значение, которое по умолчанию установлено на true. Он удаляет теги \r, \n или \r\n в HTML.

Установите переменную на false (несколько раз в сценарии ..), и ваша проблема решена.

2 голосов
/ 16 ноября 2011

Вам не нужно менять все $stripRN на false, единственное, что влияет на это поведение, находится в строке 816 ``:

// load html from string
function load($str, $lowercase=true, $stripRN=false, $defaultBRText=DEFAULT_BR_TEXT) {

Также рассмотрите возможность изменения строки 988, поскольку многобайтовые функции часто не устанавливаются на машинах, которые не работают с не западноевропейскими языками. Оригинальная строка в v1.5 немедленно ломает скрипт:

if (function_exists('mb_detect_encoding')) { $charset = mb_detect_encoding($this->root->plaintext . "ascii", $encoding_list = array( "UTF-8", "CP1252" ) ); } else $charset === false;
1 голос
/ 01 марта 2014

Если вы проходили мимо, задаваясь вопросом, можете ли вы сделать то же самое в 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's that DOMDocument put in itself
$myContent = preg_replace("/[\n]/","",$myContent);

// Put my own \n's back
$myContent = preg_replace("/<img src=\"slashN\" \/>/i","\n",$myContent);

Важно отметить, что я знаю, без тени сомнения, что мой вклад содержал только \ n. Вы можете захотеть свои собственные вариации, если нужно учитывать \ r \ n или \ t, например, косая черта.T или косая черта. RN и т. Д.

0 голосов
/ 25 марта 2012

Другой вариант, если нужно сохранить другое форматирование, такое как абзацы и заголовки, - это использовать innertext вместо plaintext, а затем выполнить собственную очистку строки с результатом.

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

...