Редактирование PHP документов Microsoft Word str_replace и preg_replace не работают - PullRequest
1 голос
/ 18 мая 2011

Предположим, у меня есть файл 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 из $content показывает необработанную структуру source.doc , которая полна необычных символов и, как я полагаю, некоторые из них прекращают сканирование str_replace или preg_replace. Не могу понять, какой это символ и что мне делать, если я его найду.

var_dump из $new_content идентичен $ content.

Спасибо за любую помощь!

Ответы [ 2 ]

11 голосов
/ 02 января 2015

Если у вас есть файл DOCX, в котором вам нужно что-то заменить, это, как правило, архив в формате xml.Вот пример того, как заменить слово «Microsoft» на «Openoffice» в файле DOCX.

$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';
}

Надеюсь, это поможет!

3 голосов
/ 18 мая 2011

Я думаю, это то, что вы ищете :) http://phpword.codeplex.com/, поскольку файлы документов не являются обычными текстовыми файлами (попробуйте открыть один с помощью блокнота ... вы поймете мою точку зрения)

...