اگر شما php را بر روي لينوكس يا يونيكس نصب كرده باشيد، به برخي از قابليتهاي COM در PHP دسترسي نخواهيد داشت. به همين دليل ممكن است نتوانيد متني را كه درون يك فايل word قرار دارد استخراج نماييد. خواندن و كار كردن با فايل word ميتواند در بسياري مواقع مانند جستجوي ايندكس ها، آپلود متنها و .. به كار شما بيايد.
اگرچه شما ميتوانيد با استفاده از برخي كامپوننت ها و ... مانند Catdoc يا Antiword به اين قابليتها دسترسي پيدا كنيد اما در اين مقاله به بررسي راه حلي خواهيم پرداخت كه بسيار ساده تر و كارامدتر است.
البته قبلا اين نكته را هم ذكر كنيم كه اين راه حل ممكن است در برخي شرايط پاسخگو نباشد اما بسيار قابل اعتماد است به گونه ای که آن را بر روي چند هزار سند word تست كرده ایم و از صحت و دقت اجرای آن اطمینان حاصل کرده ایم.
تابعي كه در زير ميبينيد متن مورد نظر را از درون فايل word استخراج كرده و آن را به صورت يك رشته بدون هيچ گونه فرمت متني برميگرداند. دقت كنيد كه برخي از بخشهاي فايل word مانند header و footer آن استخراج نخواهند شد.
این رویکرد برای تشخیص متن از شناسایی کاراکترهای NUL یا chr(00) و همچنین end line یا chr(13) استفاده میکند. به این شکل:
- محتویات فایل بر حسب chr(13) تقسیم بندی میشوند
- کلیه بخشهایی که حاوی NUL است حذف میگردند
- قسمتها مجددا به همدیگر متصل میشوند
- با استفاده از یک عبارت منظم یا همان regular expression مرتب سازی صورت میگیرد
<?php
function parseWord($userDoc)
{
$fileHandle = fopen($userDoc, "r");
$line = @fread($fileHandle, filesize($userDoc));
$lines = explode(chr(0x0D),$line);
$outtext = "";
foreach($lines as $thisline)
{
$pos = strpos($thisline, chr(0x00));
if (($pos !== FALSE)||(strlen($thisline)==0))
{
} else {
$outtext .= $thisline." ";
}
}
$outtext = preg_replace("/[^a-zA-Z0-9\s\,\.\-\n\r\t@\/\_\(\)]/","",$outtext);
return $outtext;
}
?>
استفاده از تابع بالا بسيار ساده است، مثلا میتوانید به شکل زیر از آن استفاده نمایید:
$text = parseWord($userDoc);
متن بازيابي شده ميتواند پس از انجام اين مرحله مورد استفاده قرار بگيرد.