当前位置: 首页 > 知识库问答 >
问题:

如何对DOCX/ODT(rtf)文件中带有空格的字符进行计数?

潘青青
2023-03-14

我试着简单地做--打开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).";

例如,如果我上传了这个文件,我可以通过我的代码76015字符获得,但是Word显示的是76113所以有一百个字符丢失了。

有没有人知道怎么把它变得更精确?你的帮助将不胜感激。

但可能导致问题的是读取zip文件会引起一些麻烦--在字符串前后添加空间,并添加一些未打印但已计数的字符。知道吗?如果我将相同的文本直接复制到计数函数中,它就可以正常工作了。

共有1个答案

鲁才艺
2023-03-14

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

要有一个准确的计数,你将首先需要移除“未打印”的节点,但可能包含一些文本,例如,图像和对象的标题和描述,...

如果您编写一个递归函数,通过nodeValue为每个节点获取内容,并对结果进行修剪,那么您可能会有一点改进,但这仍然会考虑到“某些节点中的不可打印文本”。

 类似资料:
  • 我有一个.odt wordprocessing文件,要用libre office或Word处理,我需要用其他文本替换文本中的一串(20+)字符串。我知道.odt文件实际上是一个.zip文件,包含.xml文件,并且我需要访问content.xml。我是否将content.xml解压缩到一个流中,反序列化该流并使用LINQ或其他东西?或者有没有更简单的方法,使用一些现成的库?

  • 我需要计算一个单元格在一个odt上的一个表,文件,并应用条件格式,如果值>0。不在speedsheet中,是用于writer的

  • 问题内容: 我想检查一列是否有任何值为单个空格字符的值。 我最初以为 会很明智的。但不是。由于某些原因,这还将匹配具有多个空格的列: 因此,我可以使用正则表达式或十六进制编码进行测试: 两者都可以。但是我怀疑两者(肯定是后者)效率都非常低下。 有没有更好的办法? 问题答案: 甲比较两个串的需要精确匹配 通常情况下,比较中不考虑尾随空格,但运算符会强制其为: BINARY还导致尾随空格很大。 顺便说

  • 在我的应用程序中,我想读取一个文档文件(.doc或.odt或.docx)并将该文本存储在字符串中。为此,我使用下面的代码:

  • 我正在尝试从Java文本文件中读取一行。我得到一个异常。 这是文本文件中的行: 我需要用“#”拆分,这部分起作用了。当我试图访问位置1处的元素时,Java抛出异常。我想这是因为名字和姓氏之间有空格,因为当我显示的是“Chiquita”,而不是“Chiquita Sanford”。 当第一个数组索引中有多个单词时,Java对拆分是否有一些限制。

  • 问题内容: 我正在尝试编写脚本,将大照片裁剪并调整为高清壁纸。 但是该脚本似乎在文件名中带有空格的问题(例如Tumble Weed.jpg)。我怎样才能解决这个问题? 问题答案: 首先,您不需要。通过在backtics中使用,您可以使bash隐式地将字符串解析为一个列表,该列表按空格分隔。而是让bash生成列表并将其分离,而无需进行此类怪癖: 另外,您需要将所有用法都括在引号中,以使bash整体上