【问题标题】:DOM Tag and Attribute Rules and FilteringDOM 标签和属性规则和过滤
【发布时间】:2014-04-22 04:14:30
【问题描述】:

我正在使用以下代码将 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://oi58.tinypic.com/2b6v0k.jpg

2) 此外,居中标题下的作者姓名应位于单独的 Div 标记中,该标记现在也在 P 标记中(“就像上面示例图片中的单词 - Francis Bacon”)

3) 其余所有标题都应位于P 带有属性class ="h1 or h2 or..h" 的标签中,其中应使用字体大小检测h

4) 如果&lt;li&gt; 标签内只有一行,那么它应该是&lt;li&gt; content &lt;/li&gt; 目前它是&lt;li&gt;&lt;p&gt;content &lt;/p&gt;&lt;/li&gt;

5) 假设如果&lt;li&gt; 标签包含多行,则应该有p 标签

6) 删除所有Span 标签

请为我提供建议和指导...

编辑:要转换的 Html 文件的链接http://www64.zippyshare.com/v/80261796/file.html

【问题讨论】:

  • 您的前两个“规则”对我来说没有意义 - 没有足够的信息。如果您共享了一个您也想要转换的示例 HTML 文档,将会很有帮助。
  • @jonnu 添加了 html 文件链接,正如我在原始帖子底部部分中编辑的那样。参考:www64.zippyshare.com/v/80261796/file.html
  • 我只是在检查 HTML 源代码。它是没有语义信息的标签汤——我怀疑在这个文档上执行步骤 1、2、3 几乎是不可能的——不是以可重复用于另一个文档的方式。例如,您能否用一句话准确地写出您希望代码如何确定哪个标签包含标题,以及哪个标签包含作者姓名?但是,使用 PHP 的 DOM 扩展名肯定可以实现 4、5 和 6。
  • @jonnu 你能告诉我第 6 点,我推迟了休息...只是说应该在我上面说的代码中添加什么代码以使用 dom 删除所有跨度标签。非常感谢您的回复伴侣
  • 当然,没问题。已发布答案。

标签: php html dom


【解决方案1】:

6.删除标签

为了删除标签,您可以利用getElementsByTagName,因为您知道要删除的标签的“名称”。在操作 DOM 时,重要的是要了解它返回的 DOMNodeList 对象是动态的,并且会随着您更改文档而改变。这就是为什么在下面的示例中,我们将某些内容(即节点列表和节点数)存储在不会改变的变量中。如果你不这样做,你最终会出现奇怪的行为。 $nodeList-&gt;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 输出包含带有子 HTML 标记的 &lt;span&gt; 元素,上述内容可能有点过于激进。为了删除所有&lt;span&gt;标签,但保留子元素,可以使用这个方法:

$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();

【讨论】:

  • 谢谢,我的代码中已经有一些 dom 代码有问题了 .. 你能告诉我在哪里插入这些代码吗 ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2017-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多