PHP редактирование str_replace и preg_replace документа Microsoft Word не работает

#php #ms-word #preg-replace #str-replace

#php #ms-word #preg-заменить #str-заменить

Вопрос:

Предположим, у меня есть файл 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 of $new_content идентично $content.

Большое спасибо за любую помощь!

Комментарии:

1. MS Word сохраняет свои файлы в сжатом формате, поэтому вы не сможете просмотреть или отредактировать содержимое, не распаковав его предварительно. Но даже если вы это сделаете, вам нужно будет знать подробности формата файла (их несколько), и нет никакой гарантии, что слово на странице сохранено в файле в виде непрерывных символов.

Ответ №1:

Если у вас есть файл 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';
}
  

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

Комментарии:

1. Было бы неплохо, если бы вы также добавили источник в качестве ссылки на свой ответ.

2. Что вы имеете в виду? Исходный код или ссылка на какой-либо другой источник?

3. Ах, извините. Я неправильно истолковал ответ. Я думал, вы нашли ответ в Google. Если бы это было так, ссылка на источник была бы хорошей вещью. В любом случае, добро пожаловать в Stack Overflow.

4. Это отлично работает!! Но один совет, потому что это меня немного огорчило. Если вы используете коды замены, как я (например, {MYVAL} или etc), И это не изменится… отправьте измененное содержимое в браузер и проверьте. Вы найдете тонны XML-мусора вокруг ваших кодов замены. Создайте свой код соответствующим образом.

5. как заменить много строк в этом сценарии? например, $ newContents1 = str_replace(‘Microsoft1’, ‘Openoffice1’, $oldContents); $ newContents2 = str_replace(‘Microsoft2’, ‘Openoffice2’, $ oldContents);

Ответ №2:

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

Комментарии:

1. Просто имейте в виду, что PHPWord project позволяет вам открывать только файлы DOCX (сжатые файлы формата OpenXML) и манипулировать ими. Это не сработает, если вам нужно иметь дело со старым форматом DOC.