extracttext funkcija dos Jums iespēju no sarežģīti izveidotā Word dokument XML formāta uz internetbrauzerim pieņememu HTML kodu ar nepieciešamo formatējumu.
No sākuma mēs pārbaudīsim parsējamā faila formātu.
$ext = explode('.', $filename); $ext = $ext[count(explode('.', $filename)) - 1]; if($ext == 'docx') $dataFile = "word/document.xml"; else $dataFile = "content.xml";
Veidojam ZIP objektu un cenšamies atvērt to kā DOMDocument:
$zip = new ZipArchive; if (true === $zip->open($filename)) { if (($index = $zip->locateName($dataFile)) !== false) { $text = $zip->getFromIndex($index); $xml = new DOMDocument(); $xml->loadXML($text); $ret = $xml->saveHTML(); ... } }
Kad esam ieguvuši XML dokumentu, mums tas jāsadala loģiskos blokos. Es izvēlējos to sadalīt pa paragrāfiem.
$ret = str_replace("</w:p>", "<br />", $ret);
Esam nonākuši pie pašas interesantākās daļas, kur mums jāpārveido XML par HTML. Paņemam katru elementu “w:r” un parsējam to ar nodeToHtml funkciju kuru apskatīsim nedaudz vēlāk.
preg_match_all( "'<w:r(.*?)\<\/w:r\>'", $ret, $get, PREG_OFFSET_CAPTURE); foreach ( $get[0] as $node_key => $node ) $ret = str_replace($node[0], nodeToHtml($node[0]), $ret);
nodeToHtml:
function nodeToHtml( $node_content ) { //Pārbaudām vai šim nodam ir jādod bold formatēšana preg_match( "'\<w:b\>\<\/w:b\>'", $node_content, $bold ); //Pārbaudām vai šim nodam ir jādod italic formatēšana preg_match( "'\<w:i\>\<\/w:i\>'", $node_content, $italic ); //Iegūstam fonta izmēru preg_match( "'\<w:sz w:val=\"(.*?)\"\>\<\/w:sz\>'", $node_content, $font_size ); //Iegūstam teksu preg_match( "'\<w:t(.*?)\>(.*?)\<\/w:t\>'", $node_content, $text ); //Fonta nosaukumu nemēģinām iegūt, jo droši vien vēlēsimies izmantot savu $tag_name = 'span'; $style = ' style="'; $content = $text[ 2 ]; if( count( $bold ) > 0 ) $style .= 'font-weight: bold; '; if( count( $italic ) > 0 ) $style .= 'font-style: italic; '; if( count( $font_size ) > 0 ) $style .= 'font-size: ' . $font_size[1] . 'px '; $style .= '" '; return '<' . $tag_name . $style . '>' . $content . '</' . $tag_name . '>'; }
Tālāk mums būtu jātiek vaļa no visiem pārējiem XML tegiem, sadalīt tos māsīva pa paragrāfiem un atstāt tikai mūsu izveidotos span elementus ar formatējumiem:
preg_match_all( "'(.*?)\<br \/\>'", $ret, $p); $data = array(); foreach ($p[0] as $key => $paragraph) { $data[ $key ] = ''; preg_match_all( "'\<span(.*?)\>(.*?)\<\/span\>'", $paragraph, $spans ); foreach ($spans[0] as $span) $data[ $key ] .= $span; }
Tas arī viss. $data mums ir masīvs ar paragrāfu katrā no tā elementiem, kas satur tikai HTML kodu.
Turpinājumu Jūs varat atrast šeit.