#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.