PHP编辑Microsoft Word文档str_replace和preg_replace不起作用

时间:2011-05-18 14:00:07

标签: php ms-word preg-replace str-replace

假设我有MSWord文件source.doc,下一个内容是“Microsoft Word文件的内容”。 例如,我想通过PHP打开它并将单词“Microsoft”替换为“Openoffice”并将结果保存到 result.doc 中。 以下是使用preg_replace的代码:

$content = file_get_contents( SOMEPATH . '/source.doc' );
$new_content = preg_replace( '/Microsoft/i', 'Openoffice', $content );
file_put_contents( SOMEPATH . '/target.doc', $new_content );

或使用str_replace

$content = file_get_contents( SOMEPATH . '/source.doc' );
$new_content = str_replace( 'Microsoft', 'Openoffice', $content );
file_put_contents( SOMEPATH . '/target.doc', $new_content );

它们都不起作用。代码运行没有任何异常,但 target.doc source.doc 相同。替换不执行。

我尝试了很多不同的收录,例如正则表达式修饰符,iconv等,但没有任何帮助。

var_dump的{​​p} $content显示 source.doc 的原始结构,其中包含不常见的字符,我想其中一些内容会停止str_replace或{{ 1}}扫描。无法确定它是哪个字符,如果我找到它,我该怎么办。

preg_replace的{​​p> var_dump与$ content相同。

感谢您的帮助!

2 个答案:

答案 0 :(得分:11)

如果你有一个DOCX文件,你需要更换一些东西,它基本上是一个压缩的xml存档。 以下是如何在DOCX文件中将“Microsoft”替换为“Openoffice”的示例。

$zip = new ZipArchive;
//This is the main document in a .docx file.
$fileToModify = 'word/document.xml';
$wordDoc = "Document.docx";

if ($zip->open($wordDoc) === TRUE) {
    //Read contents into memory
    $oldContents = $zip->getFromName($fileToModify);
    //Modify contents:
    $newContents = str_replace('Microsoft', 'Openoffice', $oldContents);
    //Delete the old...
    $zip->deleteName($fileToModify);
    //Write the new...
    $zip->addFromString($fileToModify, $newContents);
    //And write back to the filesystem.
    $return =$zip->close();
    If ($return==TRUE){
        echo "Success!";
    }
} else {
    echo 'failed';
}

希望这有帮助!

答案 1 :(得分:3)

我认为这就是你要找的东西:) http://phpword.codeplex.com/因为doc文件不是普通的文本文件(尝试用记事本打开一个......你会明白我的意思)