2011-01-27 3 views
21

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

+2

Используйте встроенный анализатор dom, а не простой html dom. Встроенный парсер на порядок быстрее. http://whitlock.ath.cx/FastCrawl/benchmark.php –

+4

Извините, @ByronWhitlock, но я не использую Simple HTML DOM Parser для скорости, я использую его, чтобы делать тонны вещей, которые я просто не могу сделать с DOMDocument, и это намного проще! Но, OH <, что я сделал бы для PHP Extension версии Simple HTML DOM Parser! –

ответ

19

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

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

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

+0

Спасибо за этот ответ, вы только что сэкономили день: D – mingos

+3

Я ** действительно ** хочу, чтобы это было задокументировано на их сайте. Привет, помощник! –

+0

спасибо, та же проблема! – Zabs

2

Вам не придется менять все $stripRN к ложным, только один, который влияет на такое поведение в строке 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; 
46

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

load Функция PHP Simple HTML DOM Parser поддерживает несколько полезных параметров:

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) 

Edit: Для 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) 
+1

Спасибо .. Очень полезно. Это только я или эти параметры недокументированы, потому что для жизни я не мог найти никакого официального слова о том, как это сделать, пока я не наткнулся на это? – userabuser

+0

Рад, что я мог помочь. Я тоже не нашел на нем никакой документации. Я на самом деле собирался модифицировать библиотеку, чтобы добавить эту функциональность сам, когда я наткнулся на это. – Hiteklife

+0

@userabuser Полностью недокументирован;// –

-2

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

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

+8

-1 Это настолько оскорбительно, что я приносил в жертву карму, чтобы просто ругать вас. –

1

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

У меня был фрагмент кода, который я хотел аккуратно, но сохранить точные разрывы строк в нем содержится (\ п) Это то, что я сделал ....

// 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. Например, slash.T или слэш ,RN и т. Д.

Смежные вопросы