PDA

View Full Version : سوال: مشکل با تابع fopen



esteftaats1368
جمعه 09 فروردین 1392, 22:55 عصر
سلام دوستان عزیز.
من برای کار با تابع
fopen()
مشکل دارم. یعنی می خوام باهاش کدهای html سایت های دیگه رو بخونم اما جواب درست حسابی نمیده.
کد من :



<?php
$fp = fopen("http://www.example.com" ,"r");
$data = fgets($fp, 100);
echo $data;
fclose($fp);
?>

وقتی اجراش می کنم هیچی چاپ نمیشه.
خیلی ممنون میشم مشکلمو حل کنین.

MostafaEs3
جمعه 09 فروردین 1392, 23:06 عصر
راه حل ::


$fp = fopen("http://www.example.com" ,"r");

if ($fp) {
while (!feof($fp)) {
$buffer = fgets($fp, 4096);
echo $buffer;
}
fclose($fp);
}

دراینجا یک دستگیره داریم و یک حلقه که مرتب چک میکنه اگر به انتهای فایل نرسیده بود بازهم خوندن رو ادامه میده و درنهایت هم دستگیره بسته میشه

esteftaats1368
شنبه 10 فروردین 1392, 00:05 صبح
راه حل ::


$fp = fopen("http://www.example.com" ,"r");

if ($fp) {
while (!feof($fp)) {
$buffer = fgets($fp, 4096);
echo $buffer;
}
fclose($fp);
}

دراینجا یک دستگیره داریم و یک حلقه که مرتب چک میکنه اگر به انتهای فایل نرسیده بود بازهم خوندن رو ادامه میده و درنهایت هم دستگیره بسته میشه
ممنون دوست عزیز. سایت رو که عوض کردم خود سایت بالا اومد. حالا اگه بخوام خط های خاصی رو بخونم مثلا خط 10 رو باید چیکار کنم؟

MostafaEs3
شنبه 10 فروردین 1392, 00:34 صبح
ممنون دوست عزیز. سایت رو که عوض کردم خود سایت بالا اومد. حالا اگه بخوام خط های خاصی رو بخونم مثلا خط 10 رو باید چیکار کنم؟


دو راه وجود داره ... یا اینکه سایت رو با تابع file دریافت کنید که خودش محتوا رو دریافت و هر خط رو توی یک ردیف آرایه میریزه
راه دوم اینکه اول با یکی از روش های (fopen , curl , file_get_contents , fsockopen) و یا هر روشی که دوست دارید محتوا رو دریافت کنید ... سپس به کمک str_replace تمامی r\ ها رو حذف کنید و بر اساس n\ اکسپلود کنید . درنهایت هرکدوم از خطوط در یک ردیف آرایه قرار میگیرن
مثال ::


$contents = file_get_contents('http://example.com');
$contents = str_replace("\r", "", $contents);
$contents = explode("\n", $contents);

echo '<pre>';
print_r($contents);
echo '</pre>';

esteftaats1368
شنبه 10 فروردین 1392, 01:24 صبح
دو راه وجود داره ... یا اینکه سایت رو با تابع file دریافت کنید که خودش محتوا رو دریافت و هر خط رو توی یک ردیف آرایه میریزه
راه دوم اینکه اول با یکی از روش های (fopen , curl , file_get_contents , fsockopen) و یا هر روشی که دوست دارید محتوا رو دریافت کنید ... سپس به کمک str_replace تمامی r\ ها رو حذف کنید و بر اساس n\ اکسپلود کنید . درنهایت هرکدوم از خطوط در یک ردیف آرایه قرار میگیرن

بازم ممنون دوست عزیز.
فقط نمی دونم اون دو عبارتی که قرمز کردمشون چی هستن

MostafaEs3
شنبه 10 فروردین 1392, 02:10 صبح
بازم ممنون دوست عزیز.
فقط نمی دونم اون دو عبارتی که قرمز کردمشون چی هستن

یکسری عبارات خاص که توی عبارات منظم بهش میگن Escape sequences - کلا عباراتی که اولشون اسلش هست . مثلا n\ و r\ برای رفتن به خط بعد (که n\ درون لینوکس و r\ درون ویندوز استفاده میشه یعنی notepad ویندوز عبارت n\r\ رو برای هر خط قرار میده)

و همینطور مثلا عبارت t\ برای یک تب (توی ++notepad وقتی تب میزنید قرار داده میشه ولی توی notepad اینطور نیست) . یکسری دیگه هم داریم که برای کاراکترهای utf-8 و زبانهای مختلف و Unicode بکار میره . برای اطلاعات بیشتر این صفحه از آموزش عبارات منظم رو مطالعه کنید :: http://www.php.net/manual/en/regexp.reference.escape.php

درضمن یک نکته :: دقت کنید این عبارات الزاما باید توی دابل کوتیشن قرار داده بشه و اگر توی کوتیشن قرار بدید عمل نمیکنه ... زمانی که شما توی echo مثلا یک n\ قرار میدید توی سورس مرورگر یک خط به جلوتر هدایت میشه ولی مرورگر درحالت text/html این رو نمایش نمیده . ولی اگر این تابع رو اول کدهاتون قرار بدید ::


header('Content-Type: text/plain; charset=UTF-8');

یا اینکه از تگ pre استفاده کنید تمامی عبارات مثل n\ عمل میکنن و به خط بعدی هدایت میشه. توی تمام فایلها هم این قضیه رو داریم . حالا ما توی کدبالا اول اومدیم r\ رو برداشتیم که اگر به صورت های مختلف این دوتا (n\ و r\) کنار هم قرار گرفته باشن به مشکل برخورد نکنیم . سپس چون فقط n\ باقی میمونه بر این اساس explode انجام دادیم.
---------------------
کلا این نکته رو درنظر داشته باشید توی سرور های ویندوزی برای رفتن به خط بعد باید از r\ و توی سرور های لینوکس باید از n\ استفاده کنید . حالا اگر نمیدونید که اسکریپت شما از چه سیستم عاملی داره استفاده میکنه از PHP_EOL به عنوان یک ثابت استفاده کنید . مثال ::


header('Content-Type: text/plain; charset=UTF-8');

echo "I want to buy a coffee". PHP_EOL;
echo "I want to buy a coffee". PHP_EOL;

esteftaats1368
شنبه 10 فروردین 1392, 12:33 عصر
یکسری عبارات خاص که توی عبارات منظم بهش میگن Escape sequences - کلا عباراتی که اولشون اسلش هست . مثلا n\ و r\ برای رفتن به خط بعد (که n\ درون لینوکس و r\ درون ویندوز استفاده میشه یعنی notepad ویندوز عبارت n\r\ رو برای هر خط قرار میده)

و همینطور مثلا عبارت t\ برای یک تب (توی ++notepad وقتی تب میزنید قرار داده میشه ولی توی notepad اینطور نیست) . یکسری دیگه هم داریم که برای کاراکترهای utf-8 و زبانهای مختلف و Unicode بکار میره . برای اطلاعات بیشتر این صفحه از آموزش عبارات منظم رو مطالعه کنید :: http://www.php.net/manual/en/regexp.reference.escape.php

درضمن یک نکته :: دقت کنید این عبارات الزاما باید توی دابل کوتیشن قرار داده بشه و اگر توی کوتیشن قرار بدید عمل نمیکنه ... زمانی که شما توی echo مثلا یک n\ قرار میدید توی سورس مرورگر یک خط به جلوتر هدایت میشه ولی مرورگر درحالت text/html این رو نمایش نمیده . ولی اگر این تابع رو اول کدهاتون قرار بدید ::


header('Content-Type: text/plain; charset=UTF-8');

یا اینکه از تگ pre استفاده کنید تمامی عبارات مثل n\ عمل میکنن و به خط بعدی هدایت میشه. توی تمام فایلها هم این قضیه رو داریم . حالا ما توی کدبالا اول اومدیم r\ رو برداشتیم که اگر به صورت های مختلف این دوتا (n\ و r\) کنار هم قرار گرفته باشن به مشکل برخورد نکنیم . سپس چون فقط n\ باقی میمونه بر این اساس explode انجام دادیم.
---------------------
کلا این نکته رو درنظر داشته باشید توی سرور های ویندوزی برای رفتن به خط بعد باید از r\ و توی سرور های لینوکس باید از n\ استفاده کنید . حالا اگر نمیدونید که اسکریپت شما از چه سیستم عاملی داره استفاده میکنه از PHP_EOL به عنوان یک ثابت استفاده کنید . مثال ::


header('Content-Type: text/plain; charset=UTF-8');

echo "I want to buy a coffee". PHP_EOL;
echo "I want to buy a coffee". PHP_EOL;

بازم ممنون دوست عزیز.
من خواستم اون کدها رو توی یه فایل ینویسم ولی فقط کلمه array چاپ شد. البته با تغییری که دادم. چرا کد اون سایت نوشته نشد؟


<?php
$contents = file_get_contents('http://www.example.com');
$contents = str_replace("\r", "", $contents);
$contents = explode("\n", $contents);
//echo '<pre>';
// print_r($contents);
//echo '</pre>';
$f = fopen ("readmee.txt", "w");
fwrite($f , $contents);
fclose($f);
?>

MostafaEs3
شنبه 10 فروردین 1392, 15:52 عصر
خب زمانی که شما بر اساس n\ خط ها رو بشکنید هر خط توی یک ردیف آرایه قرار میگیره ... که میتونید شماره خط مورد نظرتون رو با یک کلید دریافت کنید . مثلا ::


echo $contents[12];

حالا اگر بخواهید کل محتوای دریافت شده رو توی یک فایل ذخیره کنید میبایست مرحله ی explode رو حذف کنید