Я использую следующий код для преобразования doc и docx в лишенный html
<?php class docxhtml { /** @var string */ private $tag; /** @var string */ private $attribute; public $connectname; public $connectpass; public function __construct($format_res, $flname) { require_once('config.php'); // Turn up error reporting error_reporting(E_ALL | E_STRICT); // Turn off WSDL caching ini_set('soap.wsdl_cache_enabled', 0); // Define credentials for LD define ('USERNAME', $this->connectname); define ('PASSWORD', $this->connectpass); // SOAP WSDL endpoint define ('ENDPOINT', 'https://api.livedocx.com/2.1/mailmerge.asmx?wsdl'); // Define timezone date_default_timezone_set('Europe/Berlin'); // Instantiate SOAP object and log into LiveDocx $this->soap = new SoapClient(ENDPOINT); $this->soap->LogIn( array('username' => USERNAME, 'password' => PASSWORD) ); // Upload template $this->data = file_get_contents('Original/' . $format_res); $this->soap->SetLocalTemplate( array('template' => base64_encode($this->data), 'format' => 'docx') ); $this->result = $this->soap->RetrieveDocument( array('format' => 'html') ); $this->data = $this->result->RetrieveDocumentResult; $exceptions = array( 'a' => array('href'), 'img' => array('src') ); $this->stripAttributes($exceptions); file_put_contents('Recode/' . $flname . '.html', base64_decode($this->data)); } public function stripAttributes(array $exceptions) { $dom = new DOMDocument(); $dom->strictErrorChecking = false; $dom->formatOutput = true; $dom->loadHTML(base64_decode($this->data)); $xpath = new DOMXPath($dom); if (false === ($elements = $xpath->query("//*"))) die('Xpath error!'); /** @var $element DOMElement */ foreach ($elements as $element) { for ($i = $element->attributes->length; --$i >= 0;) { $this->tag = $element->nodeName; $this->attribute = $element->attributes->item($i)->nodeName; if ($this->checkAttrExceptions($exceptions)) continue; $element->removeAttribute($this->attribute); } } $this->data = base64_encode($dom->saveHTML()); } public function checkAttrExceptions(array $exceptions) { foreach ($exceptions as $tag => $attributes) { if (empty($attributes) || !is_array($attributes)) { die('Attributes not set!'); } foreach ($attributes as $attribute) { if ($tag === $this->tag && $attribute === $this->attribute) { return true; } } } return false; } }
Теперь я хочу добавить правила и фильтры к получаемому html-выводу следующим образом
1) Весь центрированный заголовок должен быть тегом Div
теперь он является тегом P
Sample : http://img.ruphp.com/php/2b6v0k.png
2) Также имя автора под центрированным заголовком должно быть в отдельном теге Div
который также теперь находится в теге P
(«Как слово – Фрэнсис Бэкон в приведенном выше образце»)
3) Остальные заголовки должны находиться в class ="h1 or h2 or..h"
P
с class ="h1 or h2 or..h"
атрибута class ="h1 or h2 or..h"
где значение h
должно быть обнаружено с размером шрифта
4) Если в <li>
есть только одна строка, то она должна быть <li> content </li>
настоящее время <li><p>content </p></li>
5) предположим, что если <li>
содержит несколько строк, должен быть тег p
6) Удалите все теги Span
Пожалуйста, предоставьте мне советы и рекомендации по его выполнению …
Изменить: ссылка на файл HTML для конвертирования http://www64.zippyshare.com/v/80261796/file.html
6. Удаление меток
Чтобы удалить теги, вы можете использовать getElementsByTagName, так как вы знаете «имя» тега, который хотите удалить. При манипулировании DOM важно понимать, что объект DOMNodeList
который он возвращает, является динамическим и будет меняться при изменении документа. Вот почему в приведенном ниже примере мы сохраняем некоторые вещи (то есть список узлов и количество узлов) в переменных, которые не будут меняться. Если вы этого не сделаете, вы получите нечетное поведение. $nodeList->item(0)
всегда будет возвращать следующий совпадающий тег, который не изменяется, поскольку мы модифицируем DOM по мере продвижения.
$dom = new DOMDocument(); $dom->loadHTMLFile('english.html'); $nodeList = $dom->getElementsByTagName('span'); $nodeCount = $nodeList->length; for ($i = 0; $i < $nodeCount; $i++) { $span = $nodeList->item(0); $span->parentNode->replaceChild(new DOMText($span->textContent), $span); } echo $dom->saveHTML();
Вышеприведенное может быть немного слишком агрессивным, если ваш вывод HTML имеет элементы <span>
которые имеют дочерние HTML-теги. Чтобы удалить все теги <span>
, но сохраните дочерние элементы, вы можете использовать этот метод:
$dom = new DOMDocument(); $dom->loadHTMLFile('english.html'); $nodeList = $dom->getElementsByTagName('span'); $nodeCount = $nodeList->length; for ($i = 0; $i < $nodeCount; $i++) { $span = $nodeList->item(0); $cleaned = $dom->createDocumentFragment(); $childList = $span->childNodes; $childCount = $childList->length; for ($j = 0; $j < $childCount; $j++) { $child = $childList->item(0); $cleaned->appendChild($child); } $span->parentNode->replaceChild($cleaned, $span); } echo $dom->saveHTML();