我有一个带有HTML代码的变量(例如$ content)(没有换行符 - 之前已删除)。如何在每个打开的标记后添加TAB缩进处理HTML代码,并在每个结束标记后减少缩进级别?
P.S。我不需要外部脚本或程序(如整洁)。我需要在我自己的剧本中做到这一点。
例如: 来源内容:
<!DOCTYPE html><html><head><title>test</title></head> <body> <h1>hello!</h1><p>It works!</p></body></html>
需要的结果:
<!DOCTYPE html>
<html>
<head>
<title>test</title>
</head>
<body>
<h1>hello!</h1>
<p>It works!</p>
</body>
</html>
答案 0 :(得分:12)
use HTML::HTML5::Parser qw();
use HTML::HTML5::Writer qw();
use XML::LibXML::PrettyPrint qw();
print HTML::HTML5::Writer->new(
start_tags => 'force',
end_tags => 'force',
)->document(
XML::LibXML::PrettyPrint->new_for_html(
indent_string => "\t"
)->pretty_print(
HTML::HTML5::Parser->new->parse_string(
'<!DOCTYPE html><html><head><title>test</title></head> <body> <h1>hello!</h1><p>It works!</p></body></html>'
)
)
);
<!DOCTYPE html><html>
<head>
<title>test</title>
</head>
<body>
<h1>hello!</h1>
<p>It works!</p>
</body>
</html>
答案 1 :(得分:1)
manual page表示tidy
不会生成包含标签的输出。但它很简单,可以对输出进行后处理以解决这个问题。
$ tidy -indent foo.html | perl -pe 's|^( +)|"\t" x ((length $1) / 2)|e;'
使用现有工具必须比自己发明它更好的解决方案。但是,如果你坚持,那么你至少应该使用像Perl的HTML :: Parser这样的预先编写的解析器。
我还应该指出,您对问题的说明似乎不正确。您说您想在每个开始标记后添加标签。但是您的示例输出不会对&lt; title&gt;,&lt; h1&gt;执行此操作。或&amp; p&gt;标签
答案 2 :(得分:1)
我使用的选项是CGI::Pretty。
答案 3 :(得分:0)
您还可以尝试Marpa::HTML引用其随播广告实验室html_fmt的来源,了解如何定位文档的特定部分以进行操作。我没有使用它,今天不能尝试5.10但是它看起来很不错。