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.