【问题标题】:Preserve Line Breaks - Simple HTML DOM Parser保留换行符 - 简单的 HTML DOM 解析器
【发布时间】:2011-06-16 07:25:32
【问题描述】:

在使用PHP Simple HTML DOM Parser时,换行
标签被剥离是否正常?

【问题讨论】:

  • 使用内置的dom解析器,而不是简单的html dom。内置解析器的速度要快一个数量级。 whitlock.ath.cx/FastCrawl/benchmark.php
  • 对不起,@ByronWhitlock,但我不使用 Simple HTML DOM Parser 来提高速度,我用它来做很多我无法用 DOMDocument 做的事情,而且它更容易!但是,哦

标签: php domparser


【解决方案1】:

我知道这是旧的,但我也在寻找它,并意识到实际上有一个内置选项可以关闭换行符的删除。无需去编辑源代码。

PHP Simple 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,它是第五个参数(感谢yitwail)

str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)

【讨论】:

  • 谢谢.. 很有帮助。是我自己还是这些参数没有记录,因为在我偶然发现之前,我一生都找不到任何关于如何做到这一点的官方消息?
  • 很高兴我能帮上忙。我也没有找到任何关于它的文档。当我偶然发现这个时,我实际上打算自己修改这个库来添加这个功能。
  • @userabuser 完全无证 ;-/
  • 这是str_get_html 的第五个参数 :) 我想知道为什么这不是默认值;剥离换行符对于 javascript 单行 cmets 非常不利
【解决方案2】:

我也在为此苦苦挣扎,因为我需要在处理后轻松编辑 HTML。

显然SimpleHTMLDOM 脚本$stripRN 中有一个布尔值,默认设置为true。它会去除 HTML 中的 \r\n\r\n 标签。

将 var 设置为 false(脚本中出现了几次......),您的问题就解决了。

【讨论】:

  • 真的希望这被记录在他们的网站上。干杯,伙计!
  • 查看 Hiteklife 的答案,它似乎是一个内置(但未记录)的功能。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    如果你路过这里想知道你是否可以在 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 或 slash.RN 等

    【讨论】:

      【解决方案5】:

      如果希望保留其他格式(例如段落和标题),另一种选择是使用 innertext 而不是 plaintext,然后对结果执行您自己的字符串清理。

      我意识到这会影响性能,但它确实允许更精细的控制。

      【讨论】:

        猜你喜欢
        • 2014-01-15
        • 2013-03-23
        • 1970-01-01
        • 2012-01-17
        • 1970-01-01
        • 1970-01-01
        • 2015-03-13
        • 1970-01-01
        相关资源
        最近更新 更多