为了您的理智和方便,将 HTML 转换为 Markdown 的库。
要求:PHP 7.2+
首席开发人员:@colinodell
原作者:@nickcernis
“这是什么炼金术?”你嘀咕道。 “我明白为什么你要把 Markdown 转换为 HTML,”你继续说道,已经在思考这个问题了, “但为什么要走另一条路呢?”
通常,如果出现以下情况,您会将 HTML 转换为 Markdown:
通过发出以下命令来请求库:
composer require league/html-to-markdown
添加require 'vendor/autoload.php';
到脚本的顶部。
接下来,创建一个新的 HtmlConverter 实例,将有效的 HTML 代码传递给其convert()
函数:
use League HTMLToMarkdown HtmlConverter ;
$ converter = new HtmlConverter ();
$ html = " <h3>Quick, to the Batpoles!</h3> " ;
$ markdown = $ converter -> convert ( $ html );
$markdown
变量现在包含 HTML 的 Markdown 版本作为字符串:
echo $ markdown ; / / == > ### Quick, to the Batpoles!
附带的demo
目录包含一个可供尝试的 HTML->Markdown 转换表单。
警告
默认情况下,该库保留没有 Markdown 等效项的 HTML 标签,例如<span>
、 <div>
、 <iframe>
、 <script>
等。如果您要解析来自用户的不受信任的输入,请考虑设置strip_tags
和/或remove_nodes
下面记录了选项,还使用库(如 HTML Purifier)来提供额外的 HTML 过滤。
要删除没有 Markdown 等效项的 HTML 标签,同时保留其中的内容,请将strip_tags
设置为 true,如下所示:
$ converter = new HtmlConverter ( array ( ' strip_tags ' => true ));
$ html = ' <span>Turnips!</span> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!"
或者更明确地说,像这样:
$ converter = new HtmlConverter ();
$ converter -> getConfig ()-> setOption ( ' strip_tags ' , true );
$ html = ' <span>Turnips!</span> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!"
请注意,只有标签本身被剥离,而不是它们所包含的内容。
要剥离标签及其内容,请在remove_nodes
中传递以空格分隔的标签列表,如下所示:
$ converter = new HtmlConverter ( array ( ' remove_nodes ' => ' span div ' ));
$ html = ' <span>Turnips!</span><div>Monkeys!</div> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains ""
默认情况下,所有评论都会从内容中删除。要保留它们,请使用preserve_comments
选项,如下所示:
$ converter = new HtmlConverter ( array ( ' preserve_comments ' => true ));
$ html = ' <span>Turnips!</span><!-- Monkeys! --> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!<!-- Monkeys! -->"
要仅保留特定注释,请使用字符串数组设置preserve_comments
,如下所示:
$ converter = new HtmlConverter ( array ( ' preserve_comments ' => array ( ' Eggs! ' )));
$ html = ' <span>Turnips!</span><!-- Monkeys! --><!-- Eggs! --> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Turnips!<!-- Eggs! -->"
默认情况下,保留占位符链接。要去除占位符链接,请使用strip_placeholder_links
选项,如下所示:
$ converter = new HtmlConverter ( array ( ' strip_placeholder_links ' => true ));
$ html = ' <a>Github</a> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "Github"
默认情况下,粗体标签使用星号语法进行转换,斜体标签使用下划线语法进行转换。使用bold_style
和italic_style
选项更改这些。
$ converter = new HtmlConverter ();
$ converter -> getConfig ()-> setOption ( ' italic_style ' , ' * ' );
$ converter -> getConfig ()-> setOption ( ' bold_style ' , ' __ ' );
$ html = ' <em>Italic</em> and a <strong>bold</strong> ' ;
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "*Italic* and a __bold__"
默认情况下,按照传统 Markdown, br
标签将转换为两个空格,后跟换行符。根据 GitHub Flavored Markdown (GFM),将hard_break
设置为true
以省略两个空格。
$ converter = new HtmlConverter ();
$ html = ' <p>test<br>line break</p> ' ;
$ converter -> getConfig ()-> setOption ( ' hard_break ' , true );
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "test n line break"
$ converter -> getConfig ()-> setOption ( ' hard_break ' , false ); / / default
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "test n line break"
默认情况下, a
标签会转换为最简单的链接语法,即如果没有可用的文本或标题,则将使用<url>
语法而不是完整的[url](url)
语法。将use_autolinks
设置为false
可更改此行为以始终使用完整链接语法。
$ converter = new HtmlConverter ();
$ html = ' <p><a href="https://thephpleague.com">https://thephpleague.com</a></p> ' ;
$ converter -> getConfig ()-> setOption ( ' use_autolinks ' , true );
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "<https://thephpleague.com>"
$ converter -> getConfig ()-> setOption ( ' use_autolinks ' , false ); / / default
$ markdown = $ converter -> convert ( $ html ); / / $ markdown now contains "[https://thephpleague.com](https://thephpleague.com)"
您可以传递当前的Environment
对象来自定义,即应该使用哪些转换器。
$ environment = new Environment ( array (
/ / your configuration here
));
$ environment -> addConverter ( new HeaderConverter ()); / / optionally - add converter manually
$ converter = new HtmlConverter ( $ environment );
$ html = ' <h3>Header</h3>
<img src="" />
' ;
$ markdown = $ converter -> convert ( $ html ); / / $markdown now contains " ### Header" and "<img src="" />"
默认情况下不启用对 Markdown 表的支持,因为它不是原始 Markdown 语法的一部分。要使用表,请显式添加转换器:
use League HTMLToMarkdown HtmlConverter ;
use League HTMLToMarkdown Converter TableConverter ;
$ converter = new HtmlConverter ();
$ converter -> getEnvironment ()-> addConverter ( new TableConverter ());
$ html = " <table><tr><th>A</th></tr><tr><td>a</td></tr></table> " ;
$ markdown = $ converter -> convert ( $ html );
Setext(下划线)标题是 H1 和 H2 的默认标题。如果您更喜欢 H1 和 H2 的 ATX 样式(# Header 1 和 ## Header 2),请在实例化对象时在选项数组中将header_style
设置为 'atx':
$converter = new HtmlConverter(array('header_style'=>'atx'));
H3 优先级及较低优先级的标头始终使用 atx 样式。
链接和图像是内联引用的。不使用脚注引用(其中图像 src 和锚点 href 属性列在脚注中)。
块引用不换行 – 它使转换后的 Markdown 更易于编辑。
HTML To Markdown 需要 PHP 的 xml、lib-xml 和 dom 扩展,所有这些扩展在大多数发行版上都默认启用。
在禁用 PHP xml 扩展的 CentOS 等发行版上,可以通过安装 php-xml 来解决诸如“致命错误:未找到类 'DOMDocument'”之类的错误。
非常感谢迄今为止所有的贡献者。非常欢迎进一步的改进和功能建议。
HTML To Markdown 从提供的 HTML 创建一个 DOMDocument,遍历树,并将每个节点转换为包含等效 Markdown 的文本节点,从最深嵌套的节点开始并向内向根节点工作。
style
),则提供将标签保留为 HTML 的选项。使用这些很棒的库之一:
不过,对精灵语没有任何保证。