使用 PHP Simple HTML DOM Parser 时,换行
标记被剥离是否正常?
5 回答
我知道这很旧,但我也在寻找它,并意识到实际上有一个内置选项可以关闭换行符的删除。无需去编辑源代码。
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)
也在为此苦苦挣扎,因为我需要在处理后轻松编辑 HTML。
SimpleHTMLDOM
显然脚本中有一个布尔值,默认$stripRN
设置为true
。它去除 HTML 中的\r
,\n
或\r\n
标记。
将 var 设置为false
(脚本中多次出现..),您的问题就解决了。
您不必将 all 更改$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;
如果你路过这里想知道你是否可以在 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 等
如果希望保留其他格式(例如段落和标题),另一种选择是使用innertext
而不是plaintext
对结果执行自己的字符串清理。
我意识到性能会受到影响,但它确实允许更精细的控制。