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
Odpowiedz
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.
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;
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)
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
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
@userabuser Całkowicie nieudokumentowane; -/ –
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ę.
-1 To tak nietypowe, że poświęciłem karmę tylko po to, żeby cię zbesztać. –
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.
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 –
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