Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Zliczanie, ilości znaków ze spacją i bez spacji oraz akapitów w plikach docx
Forum PHP.pl > Forum > Przedszkole
turek93
Dzień dobry,
jestem nowym użytkownikiem forum, a sprowadza mnie tu potrzeba związana z liczeniem znaków.

Potrzebuję skryptu zliczającego ilość znaków ze spacją, bez spacji oraz ilość akapitów w pliku. Dotychczas udało mi się utworzyć poniższy kod:


Wczytywanie pliku:

  1. <form method="post" action="" enctype="multipart/form-data">
  2. <input type="file" name="docfile" />
  3. <input type="submit" name="submit" />
  4. </form>
  5.  
  6.  
  7. <?php
  8. if(isset($_POST['submit'])){
  9. $file = $_FILES['docfile']['name'];
  10. $file = str_replace(" ","_",$file);
  11. //$file = file_get_contents($file);
  12.  
  13. $ext = pathinfo($file, PATHINFO_EXTENSION);
  14. move_uploaded_file($_FILES['docfile']['tmp_name'],"uploads/".$file);
  15.  
  16. if($ext == "txt" || $ext == "pdf" || $ext == "doc" || $ext == "docx" || $ext == "odt"){
  17. $file = file_get_contents("uploads/".$file);
  18.  
  19. }
  20. }
  21. ?>
  22.  


Następnie posiadając wgrany plik, podaję go na zliczanie:


  1. <?php
  2.  
  3. /*Name of the document file*/
  4. $document = 'zliczanie.docx';
  5.  
  6. /**Function to extract text*/
  7. function extracttext($filename) {
  8. //Check for extension
  9. $splited = explode('.', $filename);
  10. $ext = array_pop($splited);
  11.  
  12. //if its docx file
  13. if($ext == 'docx')
  14. $dataFile = "word/document.xml";
  15. //else it must be odt file
  16. else
  17. $dataFile = "content.xml";
  18.  
  19. //Create a new ZIP archive object
  20. $zip = new ZipArchive;
  21.  
  22. // Open the archive file
  23. if (true === $zip->open($filename)) {
  24. // If successful, search for the data file in the archive
  25. if (($index = $zip->locateName($dataFile)) !== false) {
  26. // Index found! Now read it to a string
  27. $text = $zip->getFromIndex($index);
  28. // Load XML from a string
  29. // Ignore errors and warnings
  30. $xml = DOMDocument::loadXML($text, LIBXML_NOENT | LIBXML_XINCLUDE | LIBXML_NOERROR | LIBXML_NOWARNING);
  31. // Remove XML formatting tags and return the text
  32. return strip_tags($xml->saveXML());
  33. }
  34. //Close the archive file
  35. $zip->close();
  36. }
  37.  
  38. // In case of failure return a message
  39. return null;
  40. }
  41.  
  42.  
  43.  
  44.  
  45. echo mb_strlen(trim(extracttext($document)));
  46. echo '<br/>';
  47. echo mb_strlen(extracttext($document));
  48. ?>



Wynik jaki uzyskuje to 1155 znaków przy użyciu funkcji trim, 1157 bez funkcji trim.

Powinienem uzyskać 1010 samych znaków bez spacji oraz 1133 ze spacjami.

Dopiero niedawno rozpocząłem swoją przygodę z programowaniem, więc proszę nie zbrukać mnie z poziomem chodnika.
Dziękuję za wszelkie opinie i pomoc.
viking
Nie mam pod ręką oryginalnego Worda ale LibreOffice wyeksportowany jako .docx zapisuje te dane w pliku app.xml.
turek93
Zgadzam się z tym spostrzeżeniem. W pliku app.xml dostaje następujące informacje:

  1.  
  2. <Properties><Template>Kreatywny życiorys, zaprojektowany przez firmę MOO.dotx
  3. </Template>
  4. <TotalTime>4</TotalTime>
  5. <Pages>2</Pages>
  6. <Words>151</Words>
  7. <Characters>1066</Characters>
  8. <Application>Microsoft Macintosh Word</Application>
  9. <DocSecurity>0</DocSecurity>
  10. <Lines>50</Lines>
  11. <Paragraphs>26</Paragraphs>
  12. <ScaleCrop>false</ScaleCrop>
  13. <HeadingPairs>
  14. <vt:vector size="2" baseType="variant">
  15. <vt:variant><vt:lpstr>Title</vt:lpstr></vt:variant><vt:variant
  16. ><vt:i4>1</vt:i4></vt:variant></vt:vector></HeadingPairs><TitlesOfParts>
  17. <vt:vector size="1" baseType="lpstr"><vt:lpstr/></vt:vector></TitlesOfParts>
  18. <Company/><LinksUpToDate>false</LinksUpToDate>
  19. <CharactersWithSpaces>1191</CharactersWithSpaces>
  20. <SharedDoc>false</SharedDoc>
  21. <HyperlinksChanged>false</HyperlinksChanged>
  22. <AppVersion>15.0000</AppVersion></Properties>
  23.  
  24.  


O ile sie nie mylę to wskazuje mi 1066 znaków oraz 1191 ze spacjami, czyli również inną liczbę niż word i mój kod.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.