2011-01-27 10 views
21

Podczas korzystania z PHP Simple HTML DOM Parser, czy to normalne, że znaczniki końca linii są usuwane?Zachowaj podział wierszy - prosty analizator DOM DOM

+2

Użyj wbudowanego parsera DOM, a nie prostego html dom. Wbudowany parser jest o rząd wielkości szybszy. http://whitlock.ath.cx/FastCrawl/benchmark.php –

+4

Przepraszam, @ByronWhitlock, ale nie używam prostego parsera HTML DOM dla szybkości, używam go do zrobienia ton rzeczy, których po prostu nie mogę zrobić z DOMDocumentem, i jest o wiele łatwiej! Ale, OH

Odpowiedz

19

Również borykałem się z tym problemem, ponieważ wymagałem, aby kod HTML był łatwo edytowalny po przetworzeniu.

Prawdopodobnie istnieje boolean w skrypcie SimpleHTMLDOM$stripRN, który jest domyślnie ustawiony na true. Usuwa znaczniki \r, \n lub .

Ustaw zmienną na false (kilka wystąpień w skrypcie ..) i problem zostanie rozwiązany.

+0

dzięki za tę odpowiedź, właśnie zapisałeś dzień: D – mingos

+3

Ja ** naprawdę ** żałuję, że to było udokumentowane na ich stronie internetowej. Zdrowie przyjacielu! –

+0

dzięki miał ten sam problem! – Zabs

2

Nie trzeba zmienić wszystkie $stripRN false, jedyną osobą, która ma wpływ na takie zachowanie jest na linii 816 ``:

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

również pod uwagę zmianę linii 988, ponieważ funkcje wielobajtowe często nie są zainstalowane na maszynach, które nie obsługują języków innych niż języki zachodnioeuropejskie. Oryginalna linia v1.5 łamie skrypt bezpośrednio:

if (function_exists('mb_detect_encoding')) { $charset = mb_detect_encoding($this->root->plaintext . "ascii", $encoding_list = array("UTF-8", "CP1252")); } else $charset === false; 
46

wiem, że to jest stary, ale ja szukałem to za dobrze, a realizowany był rzeczywiście zbudowany w opcji, aby wyłączyć usuwanie podziałów wierszy . Nie musisz już edytować źródła.

load funkcja PHP prostego HTML parser DOM obsługuje wiele użytecznych parametrów:

load($str, $lowercase=true, $stripRN=false, $defaultBRText=DEFAULT_BR_TEXT) 

Po wywołaniu funkcji load, wystarczy przejść false jako trzeci parametr.

$html = new simple_html_dom(); 
$html->load("<html><head></head><body>stuff</body></html>", true, false); 

Jeśli używasz file_get_html, jest to dziewiąty parametr.

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: Dla str_get_html, to piąty parametr (Dzięki 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

Dziękuję .. Bardzo pomocne. Czy to tylko ja, czy te parametry są nieudokumentowane, ponieważ na moje życie nie mogłem znaleźć żadnego oficjalnego słowa, jak to zrobić, dopóki nie natknąłem się na to? – userabuser

+0

Cieszę się, że mogę pomóc. Nie znalazłem też żadnej dokumentacji na ten temat. Właściwie to chciałem zmodyfikować bibliotekę, aby dodać tę funkcjonalność, gdy natknąłem się na to. – Hiteklife

+0

@userabuser Całkowicie nieudokumentowane; -/ –

-2

Inną opcją należy życzyć, aby zachować inne formatowanie, takie jak ust & nagłówki jest użycie innertext zamiast plaintext następnie wykonaj własne czyszczenie ciągów z wynikiem.

Zdaję sobie sprawę, że istnieje skuteczność działania, ale pozwala to na bardziej szczegółową kontrolę.

+8

-1 To tak nietypowe, że poświęciłem karmę tylko po to, żeby cię zbesztać. –

1

Jeśli przechodzisz obok zastanawiając się, czy możesz zrobić to samo w DomDocument, to proszę, powiedz, że potrafisz! - ale to trochę brudny :(

miałem fragment kodu chciałem schludny, ale zachowują dokładny linia łamie zawierała ona (\ n) To co zrobiłem ....

// 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); 
.

Ważne jest, aby pamiętać, że wiem, bez cienia wątpliwości, że moje dane wejściowe zawierały tylko \ n. Możesz potrzebować własnych odmian, jeśli \ r \ n lub \ t musi być uwzględnione, np. Slash.T lub slash .RN itp.