為了您的理智和方便,將 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 擴展,所有這些擴展在大多數發行版上都預設為啟用。
在 CentOS 等禁用 PHP xml 擴充功能的發行版上,諸如「致命錯誤:未找到類『DOMDocument』」之類的錯誤可以透過安裝 php-xml 來解決。
非常感謝迄今為止所有的貢獻者。非常歡迎進一步的改進和功能建議。
HTML To Markdown 從提供的 HTML 建立一個 DOMDocument,遍歷樹,並將每個節點轉換為包含等效 Markdown 的文字節點,從最深的巢狀節點開始並向內向根節點工作。
style
),則提供將標籤保留為 HTML 的選項。使用這些很棒的庫之一:
不過,對精靈語沒有任何保證。