Wie kann ich docx-Inhalte lesen und alle Tags entfernen, aber diese unten behalten?PHP docx Datei Inhalt lesen, aber Zeilenumbrüche, kursiv, unterstrichen und fett?
- Bold
- Italic
- Unterstrichen
- New Line
Unten ist mein Code, den ich von den anderen Antworten bekommen:
//FUNCTION :: read a docx file and return the string
// http://stackoverflow.com/questions/4587216/how-can-i-convert-a-docx-document-to-html-using-php
// https://www.jackreichert.com/2012/11/how-to-convert-docx-to-html/
function readDocx($filePath) {
// Create new ZIP archive
$zip = new ZipArchive;
$dataFile = 'word/document.xml';
// Open received archive file
if (true === $zip->open($filePath)) {
// If done, search for the data file in the archive
if (($index = $zip->locateName($dataFile)) !== false) {
// If found, read it to the string
$data = $zip->getFromIndex($index);
// Close archive file
$zip->close();
// Load XML from a string
// Skip errors and warnings
$xml = DOMDocument::loadXML($data, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
// Return data without XML formatting tags
$xmldata = $xml->saveXML();
// </w:p> is what word uses to mark the end of a paragraph. E.g.
// <w:p>This is a paragraph.</w:p>
// <w:p>And a second one.</w:p>
// http://stackoverflow.com/questions/5607594/find-linebreaks-in-a-docx-file-using-php
$xmldata = str_replace("</w:p>", "\r\n", $xmldata);
$xmldata = str_replace("<w:i/>", "<i>", $xmldata);
$contents = explode('\n',strip_tags($xmldata, "<i>"));
$text = '';
foreach($contents as $i=>$content) {
$text .= $contents[$i];
}
return $text;
}
$zip->close();
}
// In case of failure return empty string
return "";
}
$filePath = 'sample.docx';
$string = readDocx($filePath);
var_dump($string);
Bisher habe ich nur verwalten Zeilenumbrüche, aber nicht den Rest:
$xmldata = str_replace("</w:p>", "\r\n", $xmldata);
$xmldata = str_replace("<w:i/>", "<i>", $xmldata); // will get <i>Hello World <-- no closing i
Irgendwelche Ideen?
EDIT:
$xmldata = preg_replace("/<w\:i\/>(.*?)<\/w\:r>/is", "<i>$1</i>", $xmldata);
$xmldata = preg_replace("/<w\:b\/>(.*?)<\/w\:r>/is", "<b>$1</b>", $xmldata);
$xmldata = preg_replace("/<w\:u (.*?)\/>(.*?)<\/w\:r>/is", "<u>$2</u>", $xmldata);
Aber die oben genannten Lösungen haben Fehler, weil zum Beispiel:
<w:r><w:t xml:space="preserve"><w:i/>Hello</w:t></w:r><w:r><w:t xml:space="preserve"> World</w:t></w:r>
Sie werden feststellen, ich <w:i/>
und <\/w\:r>
bin ersetzt werden, weil <w:i/>
nicht paaren hat.
Irgendwelche besseren Lösungen?
bitte über meine bearbeiten sehen. Vielen Dank. – laukok