سلام. من یه کد دارم که کد رو پایین میزارم (از یه کتاب قدیمی گرفتم)
function curlGet($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$results = curl_exec($ch);
curl_close($ch);
return $results;
}
function scrapeBetween($item, $start, $end)
{
if (($startPos = stripos($item, $start)) === false) {
return false;
}
else if (($endPos = stripos($item, $end)) === false)
{
return false;
}
else
{
$substrStart = $startPos + strlen($start);
return substr($item, $substrStart, $endPos - $substrStart);
}
}
$page = curlGet('https://www.packtpub.com/');
$analyticsId = scrapeBetween($page, '(["_setAccount", "', '"])');
echo $analyticsId;
اول میاد توی تابع curlGet یه صفحه وب رو میگیره. سپس با CURLOPT_RETURNTRANSFER میاد بجای اینکه خروجی رو نمایش بده، اون رو برمیگردونه. سپس با true کردن CURLOPT_FOLLOWLOCATION اجازه ریدایرکت رو هم میدیم. سپس با CURLOPT_URL آدرس صفحه ای رو که میخوایم پردازش کنیم رو ارسال میکنیم و در نهایت این تابع باید سورس صفحه رو return کنه.
حالا در تابع scrapeBetween سه متغیر رو دریافت میکنیم. ۱- در متغیر اول سورس صفحه ای رو میفرستیم که در تابع بالا پردازش شده. ۲- در متغیر دوم چی رو خواسته؟ ۳- در متغیر سوم چی رو خواسته؟
حالا در تایع scrapeBetween از حلقه if استفاده شده که در او از تابه stripos استفاده شده:
stripos(string,find,start)
string: رشته میزبان که قرار است رشته ی مورد نظر در آن یافت شود.
find: رشته ی مورد جستجو
start: این پارامتر مشخص میکند که فعل جستجو از کجا/کدام اندیس شروع شود.
پس در if اول میاد رشته اول که از طریق scrapeBetween ارسال شده رو جستجو میکنه. اگر false بود، false برمیگردونه. درغیر اینصورت میره else if که در اون رشته دوم رو جستجو میکنه. اگر false بود، false برمیگردونه. درغیر اینصورت میره else و در اینجا:
$substrStart = $startPos + strlen($start); /// not false + strlen((["_setAccount", ")
return substr($item, $substrStart, $endPos - $substrStart);
$startPos که رشته اول هست که false نبوده.
$start ورودی اول هست که از طریق scrapeBetween ارسال شده. اون رو توی تابع strlen قرار داده که این تابع طول رشته رو برمیگردونه
این دو تا رو جمع میکنه و در $substrStart میریزه
سپس در تابع substr میزاره:
substr ( string $string , int $start [, int $length ] ) : string
این تابع قسمتی از رشته را که از start شروع میشه و به طول length است رو برمیگردونه.
string: رشته ی ورودی که قرار است عملیات مورد نظر بر روی آن اجرا شود را مشخص میکند.
start: این تابع اندیس شروع برش و استخراج کاراکترهای رشته را مشخص میکند.
length: این تابع طول رشته/تعداد کاراکترهایی که باید استخراج شود را مشخص میکند.
یعنی میاد ابتدا سورس صفحه رو میگیره. سپس از $substrStart که در بالا گفتم شروع میکنه به استخراج تا رشته دوم منهای طول بالا که در بالا توضیح دادم. این قسمت هم دقیق نفهمیدم چی شد...
حالا خروجی کد باید این باشه:
UA-284627-1
ولی خروجی یک صفحه سفید هست. چرا؟