شنبه ۲۲ شهریور ۱۴۰۴

Saturday, September 13, 2025 GMT +3:30

نمایش قسمتی از متن و پاراگراف با PHP

php-limit-word

انتخاب و نمایش قسمتی از متن و پاراگراف یکی از نیازهایی است که معمولا در طراحی امکانات صفحات وب کاربردهای زیادی دارد، به طور مثال برای ایجاد قابلیت پیش نمایش محتوای دریافت شده از پرس و جوهای دیتابیس، نمایش خلاصه متن و پاراگراف در فرم های وب، نمایش قسمتی از نتیجه در هنگام جستجو در مطالب سایت، محدود کردن نمایش محتوای در اختیار کاربران با سطح دسترسی های متفاوت و موارد مشابه دیگری این امکان مورد استفاده قرار می گیرد، خوشبختانه نمایش قسمتی از متن و پاراگراف بسته به شرایط و نیاز طراح سایت به چند شیوه مختلف چه از طریق برنامه نویسی PHP یا در هنگام اجرای پرس و جوهای دیتابیس با دستورات و توابع درونی MySQL قابل انجام است که در این آموزش در حد امکان به تفصیل هر کدام از این روش ها را بررسی می کنیم.

نمایش قسمتی از متن به صورت شمارش کلمه


یکی از روش های نمایش قسمتی از متن یا پاراگراف تعیین تعداد و میزان کلماتی است که قصد داریم در خروجی نمایش داده شوند، برای انجام این کار در PHP می توانیم از ترکیب سه تابع explode ، implode و array_splice استفاده کنیم که در نمونه کد زیر این سه تابع را در بدنه یک تابع و به ترتیب تعریف کرده ایم:
<?php
function limitWord($string, $limit){
    $words = explode(" ", $string);
    $output = implode(" ", array_splice($words, 0, $limit));
    return $output;
}
?>
برای فراخوانی تابع کافی است پاراگراف مورد نظر را در یک متغیر تعریف و متغیر را (به عنوان آرگیومنت اول) به همراه تعداد کلمات مورد نظر (به عنوان آرگیومنت دوم) و به صورت زیر فراخوانی کنیم:
<?php
$string = "آموزش کاربردی پی اچ پی نمایش قسمتی از متن و پاراگراف";
echo limitWord($string, 5);
?>
به این صورت با اجرای کدهای PHP در خروجی صفحه تنها 5 کلمه اول از مقادیر متغیر فرضی string را خواهیم داشت.
آموزش کاربردی پی اچ پی
توضیح:
- تابع explode با دریافت یک مقدار به عنوان جداکننده (در اینجا فضای خالی یا " ") از آرگیومنت اول، متن مورد نظر را که در آرگیومنت دوم تنظیم شده به صورت آرایه ای از کلمات تبدیل می کند (String to Array).
- در قسمت بعدی برنامه تابع implode مجددا عناصر آرایه را به رشته متنی تبدیل می کند (Array to String)، البته در اینجا استفاده از array_splice باعث می شود که تنها تعداد کلمات محدودی از متن مورد نظر به خروجی ارسال شوند که این تعداد در متغیر limit (آرگیومنت دوم) مشخص شده است.
نکته: برای محاسبه تعداد کلمات موجود در آرایه می توانیم از تابع sizeof یا count هم در PHP استفاده کنیم که ممکن است برای توسعه کد در شرایط متفاوت مورد نیاز باشد:
<?php
$string = "آموزش کاربردی پی اچ پی نمایش قسمتی از متن و پاراگراف";
$words = explode(" ", $string);
echo sizeof($words);
echo '<br>';
echo count($words);
?>
خروجی دستورات بالا به صورت زیر است:
11
11
به این شیوه می توانیم برنامه هوشمندتری داشته باشیم به فرض تنها اگر تعداد کلمات یک متن از مقادیر مورد نظرمان بیشتر بود قسمت array_splice اجرا شود و یا ایده های متنوع دیگری که ممکن است به ذهن برنامه نویس برسد.

نمایش قسمتی از متن به صورت شمارش حروف  


روش دیگر برای انتخاب و نمایش قسمتی از متن و پاراگراف، شمارش حروفی است که تمایل داریم به همان تعداد به خروجی ارسال شوند، برای انجام این کار می توانیم از تابع substr و برای حروف فارسی از mb_subsrt استفاده کنیم، به طور مثال در کد زیر تعداد 22 حرف اول از نمونه متنی که قبلا بررسی کردیم را با این روش استخراج کرده و به خروجی می فرستیم:
<?php
$string = "آموزش کاربردی پی اچ پی نمایش قسمتی از متن و پاراگراف";
echo mb_substr($string, 0, 22, mb_detect_encoding($string));
?>
خروجی نمونه کد بالا به صورت زیر خواهد بود:
آموزش کاربردی پی اچ پی
در حال حاضر تابع substr تنها از استاندارد ASCII پشتیبانی می کند و برای کلمات فارسی که از استاندارد UTF-8 پیروی می کنند چندان کاربردی نیست چون هر حرف فارسی در تابع substr دو کاراکتر (Multibyte) حساب شده و به همین دلیل گاهی مواقع خروجی ناقص و غیر استاندارد در انتهای متن مورد نظر چاپ می شود، به فرض:
آموزش کاربر�
همان طور که گفتیم این موضوع مربوط به ساز و کار یونیکد زبان فارسی است که هر حرف متشکل از دو بایت است اما تابع substr حروف را بر اساس شمارش هر بایت تجزیه می کند و این منجر به بروز مشکل می شود، برای رفع مشکل بهتر است از تابع mb_substr و mb_detect_encoding مطابق با نمونه بالا استفاده کنیم.

نمایش قسمتی از متن و پاراگراف در MySQL


علاوه بر روش های بالا که صرفا متکی بر دستورات و توابع زبان برنامه نویسی PHP هستند، در سیستم مدیریت پایگاه داده MySQL و به هنگام اجرای پرس و جو (Query) نیز این امکان وجود دارد که بتوانیم نتایج را به تعداد حروف یا کلمات خاصی محدود کنیم، در ادامه با دو تابع SUBSTRING و SUBSTRING_INDEX آشنا خواهیم شد.

شمارش حروف با تابع SUBSTRING در MySQL


مانند آنچه در مورد برنامه نویسی کدهای PHP گفتیم در MySQL هم به دو روش شمارش حروف و شمارش کلمه می توانیم تعداد کاراکترها یا عبارات خروجی را به عدد خاصی محدود کنیم، برای شمارش حروف از تابع SUBSTRING به شکل نمونه زیر استفاده می کنیم:
mysqli_query($conn, "SELECT id, SUBSTRING(col_name, 1, 30) AS col_name FROM tbl_name ORDER BY id DESC LIMIT 1");
در مثال بالا با استفاده از تابع درونی SUBSTRING در MySQL از جدول فرضی tbl_name، ستون col_name کاراکترهای 1 تا 30 را انتخاب کرده ایم، البته این تابع نیز نسبت به حروف فارسی در مقایسه با حروف انگلیسی رفتاری متفاوت دارد و روشی که در ادامه خواهیم گفت برای زبان فارسی مناسبتر است.

شمارش کلمه با تابع SUBSTRING_INDEX در MySQL


در اغلب مواقع صرف شمارش حروف ایدآل نیست و معمولا کاراکترهای ناقص یا اضافه در خروجی خواهیم داشت، طراحان و برنامه نویسان وب عموما به دنبال راه حلی جهت شماره کلمه به کلمه هستند که برای این منظور در MySQL تابع SUBSTRING_INDEX به شکل نمونه زیر قابل استفاده است:
mysqli_query($conn, "SELECT id, SUBSTRING_INDEX(col_name, ' ', 30) AS col_name FROM tbl_name ORDER BY id DESC LIMIT 1");
در مثال بالا با استفاده از تابع درونی SUBSTRING_INDEX در MySQL از جدول فرضی tbl_name، ستون col_name تعداد 30 کلمه اول را انتخاب کرده ایم، خوشبختانه این روش با حروف فارسی سازگار است چون مبنای کار تابع بررسی فضای خالی (' ' در آرگیومنت دوم) بین کلمات است.
دسته بندی: آموزش کاربردی » PHP
related مطالب بیشتر:
ساخت منوی هوشمند با PHP و CSS
ارسال ایمیل با PHP و کلاس PHPMailer
نمایش آمار بازدیدها با PHP بدون استفاده از دیتابیس
دریافت و نمایش پیج رنک گوگل با PHP
ساخت فید خوان آر اس اس (RSS Feed Reader) با PHP
دیدگاه
more ۱۴۷ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
روناک قادری
۲۲:۴۵ ۱۴۰۱/۰۱/۰۵
ببخشید من پیام قبلیم واسه rss این لینکه
https://yun.ir/f2ori5
نگاه کنید همه لینک ها حاوی متن فارسیه اگه پیام قبلیم نشد درست کرد میشه یه کاری کرد که لینک های این صفحه رو دربیارم؟ قبلا واسه درآوردن لینک های یک صفحه از این کد استفاده می کردم
$data = file_get_contents($_);
$s = preg_match('/<div id="result">(.*?)<div class="pagination">/ims', $data, $match);

$data = strip_tags($match[1], "<a>");
$d = preg_split("/<\/a>/",$match[1]);

foreach( $d as $k => $u ) {
if(strpos($u, "<a href=") !== false) {
$u = preg_replace("/.*<a\s+href=\"/sm","",$u);
$u = preg_replace("/\".*/","",$u);
echo str_replace('/posts/post/','/post/',$t.$u)."<br>
";
}
}
که با file_get_contents لینک هارو درمیارم واسه این صفحه که بخوام لینکهاش رو دربیارم چطوری می شه؟ لینکها با هم دربیارم کپی پست کنم مشکل من درست می شه فکر کنم این دیگه آخرین سوالم بود واسه این مدت که خیلی مزاحمتون شدم حلال کنید
با تشکر فراوان
خواهش می کنیم مسئله ای نیست، برای استخراج آیتم ها از فایل RSS می توانید از نمونه کد زیر استفاده کنید:
<?php
$url = 'http://example.com/rss.xml';
$xml = file_get_contents($url);
$document = new DOMDocument();
$document->loadXml($xml);
$xpath = new DOMXPath($document);

$expression = '//channel/item/link';

foreach ($xpath->evaluate($expression) as $link) {
echo $link->textContent . '<br>';
}
?>
روناک قادری
۲۲:۱۶ ۱۴۰۱/۰۱/۰۵
با سلام
ببخشید مزاحم همیشگی شما هم شدم خیلی ممنون درست شد دست شما درد نکنه یه سوال دیگه هم دارم دیدید وقتی لینکی که حاوی متن فارسی است کپی می کنیم بصورت کدبندی نوشته می شه! مثل لینک همین مطلب شما که حاوی متن فارسی است ولی وقتی کپی پست می کنیم اینطوری می شه
%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D9%82%D8%B3%D9%85%D8%AA%DB%8C-%D8%A7%D8%B2-%D9%85%D8%AA%D9%86-%D9%88-%D9%BE%D8%A7%D8%B1%D8%A7%DA%AF%D8%B1%D8%A7%D9%81-%D8%A8%D8%A7-php
هی چی می خواستم لینک رو بصورت فارسی اینجا وارد کنم نمی شد و کدبندی می کرد من با file_get_contents لینک سایتها رو از rss می گیرم که لینک اونجا بصورت فارسی ذخیره شده و وقتی من لینک رو اینطوری می گیرم بازم همون فارسی ذخیره می شه! من می خوام لینکی که اینطوری می گیرم مثل کپی پست کردن عمل کنه و متن فارسیش مثل لینکی بشه که اینجا پست کردم encode کردم همون خودش بود، دیگه هرکاری کردم لینک قبل ذخیره شدن هیچ تغییر کرد!
میشه اینو هم درست کرد؟
باتشکر خیلی فراوان
خدا بهتون سلامتی و خوشبختی بده
در PHP با دو تابع rawurlencode و rawurldecode می توانیم لینک ها را به صورت استاندارد RFC 3986 دیکد و یا به حالت عادی تبدیل کنیم.
https://www.php.net/manual/en/function.rawurlencode.php
روناک قادری
۱۸:۲۴ ۱۴۰۱/۰۱/۰۵
ببخشید این مدت خیلی مزاحم شما شدم
شرمنده، سوالات بنده رو بخاطر ناآگاهی ام در این زمینه ببخشید تازه کار هستم و دوست دارم یاد بگیرم و از یادگیری این چیزها منو خیلی خوشحال می کنه آیا میشه پاراگراف ها رو تفکیک کرد؟! مثلا من یه متنی دارم که 10 تا پاراگرافه هر پاراگراف هم مشخص نیست چند کلمه است ولی با تگ <p> می شن و با </p> بسته می شن
الان من می خوام موقع ارسال کدی داشته باشم که مثلا:
اگه تعداد پاراگراف ها تا سه تا بود مطالب رو توی
$item->content
ذخیره کنه اگه بیشتر بود بقیه پاراگرافها رو توی
$item->fullcontent
ذخیره کنه فکر کنم نشه؟! چون هر چی توی اینترنت گشتم واسه تعداد کاراکترها بود! اگه نمیشه واسه تعداد کارکترها چطور می شه اینکارو کرد مثلا همین روشی که گفتم اگه واسه تعداد پاراگرافها عملی نیست واسه تعداد کلمات چطوری عملی می شه!
مثال:
اگه تعداد کلمات تا 500 تا بود مطالب رو توی
$item->content
ذخیره کنه اگه بیشتر بود بقیه کلمات رو توی
$item->fullcontent
ذخیره کنه
با تشکر فراوان
موفق و پیروز باشید
خواهش می کنیم، سوالات همین طور با جزئیات و دقیق در چارچوب خدمات متداول سایت باشند مشکلی ندارند، برای شمارش تگ های p یا پاراگراف می توانید از نمونه کد زیر الگوبرداری کنید:
<?php
$html_str = '<p>پاراگراف اول</p><b>نمونه متن</b><p>پاراگراف دوم</p>';
$dom = new DOMDocument;
$dom->loadHTML('<?xml encoding="utf-8" ?>' . $html_str);
$count_tag = $dom->getElementsByTagName('p')->length;
echo $count_tag;
?>
روش شمارش کلمه در آموزش حاضر توضیح داده شده است، مثال:
<?php
$string = "آموزش کاربردی پی اچ پی نمایش قسمتی از متن و پاراگراف";
$words = explode(" ", $string);
$count = count($words);
if($count <= 500){
echo '<= 500';
} else {
echo '> 500';
}
?>
روناک قادری
۰۹:۴۰ ۱۴۰۱/۰۱/۰۵
با سلام و با تشکر از محبت های شما
درست شد نمی دونستم اینطوریه ببخشید یه سوال دیگه هم داشتم من برای این الگو یه جا لازمه که تگ اول رو اینطوری وارد کنم
<div id="Post5">
بعد هر پست سورس تگش فرق می کنه مثلا پشت شماره 6 تگش با این شروع میشه
div id="Post6">
و الا آخر حالا باید الگو رو چطوری بنویسم؟
$title = preg_match('/<div id="post5">(.*?)<\\/div>/ims', $content, $match);
چون دیو هر پست شماره اون پست رو داره
post1
post2
post3
از لطف شما بسیار سپاسگزارم
برای اینکه اعداد را به صورت غیرثابت داشته باشیم الگو را به شکل زیر می توانیم بنویسیم:
$title = preg_match('/<div id="post[0-9]+">(.*?)<\\/div>/ims', $content, $match);
روناک قادری
۱۵:۰۵ ۱۴۰۱/۰۱/۰۴
با سلام مجدد
ببخشید درست توضیح ندادم این الگو رو نگاه کنید
$title = preg_match('/<title class="h1">(.*?)<div class='content'>/ims', $content, $match);
این الگو از نظر php اشتباهه و ارور میده چون یا باید اول الگو ' باشه یا باید " باشه یعنی اینجوری
('دستور "الگو" الگو')
("دستور 'الگو' الگو")
لطفا به کاراکترهای الگو دقت کنید من توی الگو لازم است از جفتش استفاده کنم تا دقیقا از توی سورس سایت چیزی که میخوام رو پیدا کنم چون کدهای سورس دقیقا مثلا الگویی هست که من نوشتم
برای رفع خطای استفاده از سینگل و دابل کوتیشن ها (Single / Double Quotation) کافی است به آنها کاراکتر بک اسلش اضافه کنیم، به فرض:
$title = preg_match('/<title class="h1">(.*?)<div class=\'content\'>/ims', $content, $match);
این حالت زمانی در PHP مورد نیاز است که سینگل را داخل سینگل و دابل را داخل دابل کوتیشن استفاده کرده باشیم.
محسن تیموری
۱۱:۰۳ ۱۴۰۱/۰۱/۰۴
با سلام استاد گرامی
ببخشید یک سوال داشتم چرا سورس سایت دیجی کالا نشون داده نمیشه؟ یه افزونه برای وردپرس هست به نام دیجی اسکراپر که همه محصولات دیجی کالا رو می ذاره! اونا مگه خصوصیات محصول رو از طریق سورس نمیذارن؟ من هرکاری می کنم نمی تونم با استفاده از سورس دیجی کالا محصولی رو اضافه کنم!
در حال حاضر سورس سایت دیجی کالا به صورت اسکریپتی است یعنی به صورت خام سورس کد اصلی وجود ندارد و پس از اجرای Script ها محتوای سایت نمایش داده می شود، احتمالا افزونه مورد نظر از ساز و کار API یا تجزیه فایل های اسکریپت استفاده می کند.
روناک قادری
۰۹:۲۰ ۱۴۰۱/۰۱/۰۴
با سلام و درود بر شما
ببخشید راهی وجود داره واسه الگو از این
$title = preg_match("/<title[^>]*>(.*?)<div class='content'>/ims", $content, $match);
استفاده کرد؟
بجای " لازم است ' استفاده کنم به عبارتی یعنی اینارو با هم داشت؟
با تشکر
سوالتان مبهم است، لطفا دقیقا منظورتان را در خصوص "لازم است" و "اینارو با هم داشت" توضیح دهید تا امکان راهنمایی وجود داشته باشد، دقیقا از یا به چه متنی چه چیزی را می خواهید کم یا اضافه کنید؟
روستازاده
۱۶:۰۴ ۱۴۰۰/۱۲/۲۶
با سلام و تشکر استاد
توی پاسخ بالا نوشتید تابع بالا ویرایش شد! من متوجه نشدم کدوم تابع رو ویرایش کردید! با تابعی هم که شما لطف کردید و برام نوشتید هم امتحان کردم ولی پرچم ها رو نشون نداد! و واسه همه آی پی ها پرچم خالی گذاشت و نوشت eu!
منظور تابع خودتان بود که در سوال درج کرده اید، اگر تابع جایگزین را با یک آی پی تستی اجرا کنید خروجی برابر با کد دو حرفی کشورها خواهد بود به فرض:
echo getCountry('108.177.16.0');
نتیجه اینکه باید به تابع آرگیومنت درست (که همان آدرس IP است) بدهید تا خروجی مناسب دریافت کنید، با توجه به اینکه تابع به صورت مستقل صحیح عمل می کند اشکال کار باید در جای دیگری از کدهایتان باشد که آدرس IP را آماده سازی می کند یا اینکه تابع به درستی فراخوانی نشده است، به نظر رفع مشکل جز با خطایابی کل کدهای برنامه به نحو دیگری میسر نیست.
روستا زاده
۰۲:۳۴ ۱۴۰۰/۱۲/۲۶
ببخشید این کدهای من یه مشکل داره پرچم کشورها رو واسه کامنت نشون نمیده و همش پرچم ایران میزنه!
راهی داره درست بشه و بشه واسه هر آی پی پرچم خودش رو نشون بده؟!
function getCountry($ip = '') {
//tmp
//return 'ir';

if(empty($ip)) {
$ip = self::user_ip();
}

$_ = explode('.', $ip);
$_ip = "{$_[0]} . {$_[1]}";

$cache = Yii::app()->cache->get('ip_'.$_ip,1000);
if(!empty($cache)) {
return $cache;
}

$res = self::file_get_contents('http://api.wipmania.com/' . $ip, 15);
$res = strtolower($res);
if(empty($res) or $res == 'xx' or strlen($res) > 3) {
$res = 'eu';
}

Yii::app()->cache->set('ip_' . $_ip, $res);
return $res;
}
تابع بالا ویرایش شد، لطفا ببینید اگر مشکلی دیگری دارد می توانید از تابع جایگزین زیر هم برای نمایش کد کشور کاربران بر اساس آی پی آنها به صورت آنلاین استفاده کنید:
function getCountry($ip) {
$ip = trim($ip);
$xml = simplexml_load_file("http://www.geoplugin.net/xml.gp?ip=$ip");
$res = strtolower($xml->geoplugin_countryCode);
if(empty($res) or $res == 'xx' or strlen($res) > 3) {
$res = 'eu';
}
return $res;
}
روستازاده
۰۱:۴۳ ۱۴۰۰/۱۲/۲۶
از لطف و محبت شما بسیار ممنون و سپاسگزارم
به curl خودم
curl_setopt_array($ch, array(
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
CURLOPT_ENCODING => 'gzip, deflate',
CURLOPT_HTTPHEADER => array(
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-US,en;q=0.5',
'Accept-Encoding: gzip, deflate',
'Connection: keep-alive',
'Upgrade-Insecure-Requests: 1',
),
اضافه کردم همه چی درست شد قبلا هم این رو کم داشت واسه همین با خیلی از سایتها مچ نمی شد 5 سال بود که از این کد استفاده می کردم و با خیلی از سایتها مشکل داشت ولی با کمک شما مشکل کدهای curl من درست شد
عمیقا از لطف و محبت شما بسیار ممنون و سپاسگزارم
خیلی خوشحالم کردید انشاءالله خدا بهتون سلامتی و دل خوش بده سال نوتون هم مبارک باشه
سال نو خودتون و خانواده محترمتون
در پناه خدای بزرگ باشید
خوشحالیم که مشکل رفع شد، متقابلا آرزوی سلامتی، دلخوشی و سالی خوب برایتان داریم.
روستازاده
۱۱:۲۵ ۱۴۰۰/۱۲/۲۵
خدا خیرتون بده
واسه من کار نکرد متاسفانه نمی دونم چرا! رزبلاگ رو بصورت www با https بالا میاره فقط ولی وبلاگهاش اصلا هیچی نشون نمیده!
ببخشید خیلی مزاحم شما هم شدم حلال کنید فقط یه سوال دیگه وقتی واسه سایت ارز دیجیتال میزنم سرور cloudflare رو می نویسه
برای نشون دادن کدها راهی وجود داره؟
آخرین سوالم بود
با تشکر فراوان از شما
بدون بررسی آدرس مورد نظر امکان راهنمایی دقیق میسر نیست، در کل بهترین شبیه ساز برای ایجاد رفتار مرورگر با PHP استفاده از curl است به این شرط که پارامترهایی که مرورگر در درخواست خود ارسال می کند را برای curl تنظیم کرده باشیم، به فرض:
$url="http://example.com";
$agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_URL,$url);
$result = curl_exec($ch);
var_dump($result);
یا
$ch = curl_init("http://example.com");
curl_setopt_array($ch, array(
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
CURLOPT_ENCODING => 'gzip, deflate',
CURLOPT_HTTPHEADER => array(
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-US,en;q=0.5',
'Accept-Encoding: gzip, deflate',
'Connection: keep-alive',
'Upgrade-Insecure-Requests: 1',
),
));
curl_exec($ch);
روستا زاده
۰۱:۱۹ ۱۴۰۰/۱۲/۲۵
باتشکر از شما
ببینید اصلا واسه من کار نمی کنه کدها که براتون فرستادم کدهای خودتون بود و دستکاری نکردم با این دستور هم چیزی برای من نشون نمیده
echo file_get_contents('http://rozblog.com');
واسه همه سایتها کار می کنه الا این سایت! وقتی آدرس وبلاگهاش هم میذارم اصلا چیزی نشون نمیده تابع curl که گذاشتید امتحان کردم خود رزبلاگ رو بالا میاره ولی آدرس وبلاگهاش نه! واسه آدرس وبلاگها حتی یه div ساده هم می تونید تست کنید و کدش رو بهم بدید! پیرم کرد انقد الگو عوض کردم واسه سایتهای دیگه هرچی الگو میزنم کار می کنه ولی واسه رزبلاگ و وبلاگهاش نه!
نمونه کد زیر را امتحان کنید، طبق تست ما برای وبلاگ ها هم مشکل رفع می شود:
<?php
ini_set("user_agent" , "Mozilla/3.0\r\nAccept: */*\r\nX-Padding: Foo");
echo file_get_contents('http://example.com/');
?>
به جای http://example.com آدرس وبلاگ را درج کنید.
روستازاده
۱۸:۵۷ ۱۴۰۰/۱۲/۲۴
با سلام
کارتون خیلی خوبه
چرا با این کد تعدادی از سایتها رو نمیشه مشاهده کرد؟ در حالیکه برای خیلی از سایتها قابل استفاده است حتی سورس اون سایت هم قابل مشاهده است؟ مثلا هرکاری می کنم سایت rozblog.com رو نمی تونم باهاش بالا بیارم؟
<?php
$content = file_get_contents('http://webgoo.ir');
$content = str_replace('<tr>', '', $content);
$title = preg_match("/<div class=\"footer-txt\"[^>]*>(.*?)<\\/div>/ims", $content, $match);
echo $match[1];
?>
هیچ عکس العملی نشون نمیده وگرنه واسه بیشتر سایتها کار می کنه خود سورس روز بلاگ هم در دسترسه و مشکل نداره ممنون میشم جواب بدید
با تشکر
سایت مورد نظر تست شد و مشکلی برای دریافت نبود، کد مبتنی بر وجود تگ div با کلاس footer-txt است و چون این کلاس در سورس خروجی وجود ندارد، نتیجه اجرای کدها هم خالی خواهد بود، اما اگر از متغیر content با دستور echo چاپ بگیریم می بینیم که محتوای سایت بارگذاری می شود.
نکته: برخی سایت ها نیاز به تنظیم آدرس ارجاع (Referrer) و واسط کاربری (User Agent) دارند که در این صورت استفاده از تابع curl به جای file_get_contents کاربردی خواهد بود.
سعید تورگیر
۱۵:۳۱ ۱۴۰۰/۱۲/۲۰
از لطف و محبت شما بسیار ممنون و سپاسگزارم
انشاءالله که خدا به خودتون و همه عزیزانتون سلامتی و دل خوش و طول عمر با عزت دنیا و قیامت بده که به مشکلات کاربران به بهترین شیوه ممکن جواب میدین خدا بهتون سلامتی و دل خوش بده درست شد، من برای آدرس ایمیلهایی می خواستم که توی صفحات سورس قابل مشاهده بودند فقط یه مشکل دیگه دارم که ممنون می شم بررسی کنید.
من برای پیدا کردن هر شیء توی صفحات مختلف از آدرس های صفحات جدا جدا استفاده می کنم. برای پیدا کردن محتوا و عناوین از کد زیر استفاده می کنم که برای شرط های empty و empty! اول کار می کنه ولی بخوام شرط ها رو بیشتر کنم اصلا کار نمی کنه نه برای elseif و نه برای else من می خوام وقتی الگو رو توی یه صفحه پیدا نمی کنه بگرده دنبال الگوی بعدی و با شرط اینارو معین کنم
$url = Link::ins()->get('FindUrl');
$str = explode("\n",$url);
$str = array_map('trim',$str);
foreach($str as $_)
{
$data = file_get_contents($_);
$s = preg_match('/<div id="content">(.*?)<div class="page">/ims', $data , $match);
if( ! empty($s))
{
$data = strip_tags($match[1],"<a>");
$d = preg_split("/<\/a>/",$match[1]);
}

if(empty($s))
{
$s = preg_match('/<div id="content">(.*?)<div id="endpage">/ims', $data , $match);
$data = strip_tags($match[1],"<a>");
$d = preg_split("/<\/a>/",$match[1]);
}

foreach ( $d as $k=>$u ) {
if( strpos($u, "<a href=") !== false) {
$u = preg_replace("/.*<a\s+href=\"/sm","",$u);
$u = preg_replace("/\".*/","",$u);
echo $t."<br>
";}
}
}
این کد برای شرط if(empty($s)) و if(! empty($s)) به راحتی کار می کنه ولی اصلا برای شرط های elseif و بیشتر کار نمی کنه!
نمی دونم مشکل از کجاست حتی برای else هم کار نمی کنه!
خواهش می کنیم نظر لطف شما است، در مورد سوال باید یک ورودی خروجی قابل تست داشته باشیم تا ایراد کدها مشخص شود، لطفا یک echo از متغیر url حین اجرا بگیرید تا ببینیم چه ورودی به برنامه می دهید:
$url = Link::ins()->get('FindUrl');
echo $url;
سعید تورگیر
۰۴:۳۶ ۱۴۰۰/۱۲/۲۰
با سلام و درود بر شما
خدا بهتون سلامتی و دل خوش بده انشاءالله
ببخشید از این کدها گفتید میشه واسه درآوردن شماره موبایل استفاده کرد امتحان کردم خیلی خوب بود فقط ببخشید اگه بخواهیم بجای موبایل آدرس ایمیل رو انتخاب کنه چطوری باید تغییرش داد؟
با تشکر از شما
<?php
$page = file_get_contents('http://example.com');
$regex = '~(?:\+?98|0)(?:\s*\d{3}){2}\s*\d{4}~';
preg_match_all($regex, $page, $matches);
//print_r($matches);
foreach($matches[0] as $key => $value){
echo $value.'<br>';
}
برای استخراج ایمیل ها در صورتی که به صورت متنی در خروجی HTML صفحه مورد نظر وجود داشته باشند می توانید متغیر regex را در کد بالا به صورت زیر تغییر دهید:
$regex = '/[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}/i';
نکته: معمولا آدرس های ایمیل در صفحات سایت ها به صورت محافظت شده خروجی داده می شوند، در این صورت الگوی بالا برای ایمیل هایی که به صورت سورس ساده متنی نباشند کاربردی ندارد.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
2 × 9
20 × 20
=