如何在docx / odt(rtf)文件中用空格计算字符数?

时间:2015-06-05 21:23:20

标签: php character rtf docx odt

有没有办法如何在线(意思是上传表格的一部分,所以在php / javasctipt中)获取DOCX和ODT(如果可能的话)保存文件空格的字符数?我的意思是,要获得相同的字符数,如单词统计中所示?

我知道,该单词已将<characters>存储在他的app.xml文件中,但这不准确,可能没有空格或我不太清楚。

我试过这么做 - 打开xmls,计算字符并获得它的价值,但问题是,这种方式既不准确,请参阅我的代码:

$document = 'cvicnytext2.docx';

function extracttext($filename) {
    //Check for extension
    $ext = explode(".", $filename);
    $ext = end($ext);

    //if its docx file
    if($ext == 'docx')
    $dataFile = "word/document.xml";
    else
    $dataFile = "content.xml";     

    $zip = new ZipArchive;

    // Open the archive file
    if (true === $zip->open($filename)) {
        if (($index = $zip->locateName($dataFile)) !== false) {
            $text = $zip->getFromIndex($index);
            $xml = new DOMDocument();
            $xml->loadXML($text, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
            return strip_tags($xml->saveXML());
        }
        $zip->close();
    }
    return "File not found";
}

$length = strlen( utf8_decode( extracttext($document) ) );
echo "Length: ". $length."(chars with spaces).";

如果我上传例如file,我会使用我的代码76015字符,但Word显示76113,因此在某处丢失了一百个。

有人知道如何让它更精确吗?我们将非常感谢您的帮助。

更多更新

我发现内部没有太大区别: 使用函数来计算长度 - mb_strlen( $text )strlen( utf8_decode( $text ))

但是可能导致问题的原因是读取zip文件会导致一些麻烦 - 在字符串之前和之后添加空格并添加一些未打印但却被计算的字符。任何的想法?如果我将相同的文本直接复制/打到计数功能,它可以毫无困难地工作......

1 个答案:

答案 0 :(得分:0)

如果您不想深入了解ODF或OOXML标准的细节,我相信您的方法基本上是唯一可用的方法。

要获得准确的计数,首先需要删除未打印的节点&#34;但是可能包含一些文本,例如图像和对象的标题和描述,......

如果您编写一个递归函数来执行通过nodeValue为每个节点获取内容的过程并且您修剪结果但是仍然会考虑某些非打印文本,那么您可能会略有改进节点&#34;