保留换行符 - 简单的HTML DOM解析器

问题描述:

使用PHP简单的HTML DOM解析器时,是否正常换行
标签被剥离?保留换行符 - 简单的HTML DOM解析器

+2

使用内置的dom解析器,而不是简单的html dom。内置的解析器速度提高了一个数量级。 http://whitlock.ath.cx/FastCrawl/benchmark.php – 2011-01-27 04:29:29

+4

对不起,@ByronWhitlock,但我不使用简单的HTML DOM解析器的速度,我用它来做很多事情,我根本无法做的DOMDocument,而且它更容易!但是,OH 2012-07-06 18:02:17

也很苦恼,因为我需要HTML在处理后很容易编辑。

显然有在SimpleHTMLDOM脚本$stripRN一个布尔值,这是设置为true上默认。它将HTML中的\r\n\r\n标签剥离。

将var设置为false(在脚本中出现了几处),并解决了您的问题。

+0

感谢这个答案,你只是保存了一天:D – mingos 2011-10-24 11:28:25

+3

我**真**希望这被记录在他们的网站上。队友的欢呼声! – 2012-07-06 18:02:47

您不必改变所有$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; 

我知道这是老了,但我一直在寻找这样的欢迎,并意识到有实际上是一个内置的选项关闭移除管线断裂。无需编辑源代码。

的PHP简单的HTML DOM解析器的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) 

另一种选择应该一个希望保留其他格式,如段落&标题是使用innertext而非plaintext然后用结果执行自己的字符串清理。

我意识到存在性能问题,但确实可以实现更细化的控制。

如果你经过这里想知道你是否可以在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,您可能需要自己的变体,例如slash.T或斜杠。RN等