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

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 مطالب بیشتر:
تبدیل تاریخ میلادی، شمسی با مبدل JDF در PHP
دریافت و نمایش پیج رنک گوگل با PHP
ساخت فید خوان آر اس اس (RSS Feed Reader) با PHP
ارسال پارامتر به URL و دریافت مقادیر با PHP
ارسال ایمیل با PHP و کلاس PHPMailer
دیدگاه
more ۱۴۷ دیدگاه برای این مطلب ارسال شده است.
more چینش دیدگاه ها به ترتیب از جدیدترین به قدیمی ترین است.
سیدعباسی
۱۲:۰۳ ۱۴۰۳/۰۷/۲۸
برای کدی که فرستادم من از این الگو استفاده می کنم
if(strpos($feed, 'sitemap') !== false)
preg_match_all('|<url>(.*)</url>|U', $feed, $m);
else
preg_match_all('|<item>(.*)</item>|U', $feed, $m);
میخواهم از لینکهایی شروع کنه که شامل عدد باشن و آدرس سایت به تنهایی نباشن چون خیلی وقتها سایت مپ ها شامل آدرس خود سایت هستن و بعد از اون شناسه هایی مطلب رو میذارن من از شناسه ی مطلب ها میخوام لینکها رو استخراج کنم
با تشکر
بهتر بود نمونه خروجی نهایی مورد نظر را هم درج می کردید به فرض اینکه چه خروجی از سورس فایل XML مد نظر شما است، مثال:
http://link.webgoo.com/post/225
به هر صورت با توجه به توضیحات کد زیر می تواند کاربرد داشته باشد.
<?php
$feed = file_get_contents('rss.xml');
if(strpos($feed, 'sitemap') !== false)
preg_match_all('|<url>(.*)</url>|Us', $feed, $m);
else
preg_match_all('|<item>(.*)</item>|Us', $feed, $m);
//print_r($m);
foreach($m[0] as $key => $value){
preg_match('/<loc>(.*)<\/loc>/s', $value, $loc);
//echo $loc[1];
if(preg_match('/((.*)[0-9]+$)/', $loc[1], $url)){
echo $url[0];
echo '<br>';
}
}
?>
نمونه خروجی:
http://link.webgoo.com/post/225
http://link.webgoo.com/post/224
سیدعباسی
۱۱:۴۵ ۱۴۰۳/۰۷/۲۸
با سلام و خسته نباشید من میخوام از سایت مپ زیر لینک اول که شامل post است رو استخراج کنم یعنی خروجی من این نباشه
<loc>http://link.webgoo.com</loc>
و خروجی که لازم دارم این لینک هست
<loc>http://link.webgoo.com/post/225</loc>

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>http://link.webgoo.com</loc>
<lastmod>2024-09-30</lastmod>
<changefreq>weekly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>http://link.webgoo.com/post/225</loc>
<lastmod>2024-09-30</lastmod>
<priority>0.8</priority>
</url>
<url>
<loc>http://link.webgoo.com/post/224</loc>
<lastmod>2024-04-23</lastmod>
<priority>0.8</priority>
</url>
</urlset>
سیدعباسی
۱۴:۰۶ ۱۴۰۳/۰۷/۰۷
با سلام
من میخوام از متن زیر لینکش رو دربیارم
<div class="tgme_widget_message_info short js-message_info">
<span class="tgme_widget_message_views">12</span><span class="copyonly"> views</span><span class="tgme_widget_message_meta">edited &nbsp;<a class="tgme_widget_message_date" href="https://t.me/fileuni/3088"><time datetime="2024-08-16T01:32:18+00:00" class="time">05:02</time></a></span>
</div>
میخوام با استفاده از الگو خروجی من این بشه
https://t.me/fileuni/3088
و در آخر مقدار 3088 رو بصورت خروجی نهایی داشته باشم
با تشکر فراوان
برای استخراج موارد مورد نظر در PHP از تابع preg_match و عبارات باقاعده به صورت نمونه زیر می توانید استفاده کنید:
<?php 
$str = '...class="tgme_widget_message_date" href="https://t.me/fileuni/3088">...';
preg_match('/class="tgme_widget_message_date" href="(.*?)">/is', $str, $href);
//print_r($href);
preg_match('/([0-9]+)$/i', @$href[1], $href_number);
//print_r($href_number);
echo @$href_number[1];
?>
سیدعباسی
۰۳:۲۷ ۱۴۰۳/۰۵/۰۶
با سلام
ببخشید یه سوال دیگه هم دارم من با این تابع فقط یه دونه کانال رو می تونم خروجی بگیرم
<?php
$_ = ['ch1','ch2'];

function get_web_page($url)
{
$options = array(
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "spider", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 5, // timeout on connect
CURLOPT_TIMEOUT => 5, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
);

$ch = curl_init($url);
curl_setopt_array($ch, $options);
$content = curl_exec($ch);
curl_close($ch);

return $content;
}

$doc = str_get_html(get_web_page("https://t.me/s/$_"));
$message = $doc->find('.tgme_widget_message_wrap .tgme_widget_message_text', -1)->innertext; // plaintext
?>
میخوام توی آرایه چند تا کانال بذارم و وقتی کانال اول خروجی بهم داد بره واسه کانال دوم و خروجی اونم بهم بده و تا زمانی که کانال وجود داشته باشه به کار خودش ادامه بده و واسه هر کانال خروجی همون رو بهم بده
با تشکر فراوان
در حالت کلی با نمونه کد زیر می شود دور تکرار ایجاد کرد:
$var = ['ch1','ch2'];
$loop = count($var);
for($i = 0; $i < $loop; $i++){
$doc = str_get_html(get_web_page("https://t.me/s/$var[$i]"));
$message = $doc->find('.tgme_widget_message_wrap .tgme_widget_message_text', -1)->innertext;
}
اما برای نوشتن کدهای کاربردی بهتر است با جزئیات توابع و عملکرد دقیق دستورات PHP آشنا باشید تا مشکلات پیش بینی نشده بعدی ایجاد نشود.
سیدعباسی
۰۲:۱۷ ۱۴۰۳/۰۵/۰۵
با تشکر از شما
مشکلم اینکه چطوری عکس پست آخر رو بدست بیارم و بعد با الگوی که اونو نوشتید استخراجش کنم
سورس این کانال رو نگاه کنید:
https://t.me/s/tapspal
همونطوری که گفتم متن آخرین پست رو با این تابع درمیارم
$doc = str_get_html(get_web_page("https://t.me/s/tapspal"));
$message = $doc->find('.tgme_widget_message_wrap .tgme_widget_message_text', -1)->innertext; // plaintext
الان متن رو بصورت خروجی دارم. بعد باید یه تابع این شکلی داشته باشم که عکس آخر رو هم از تگ دربیارم مشکلم بزرگم با تابع پیدا کردن تگ های عکس آخره! بعد با الگویی که برام نوشتید لینکش رو بدست بیارم همه کارهای رباتم انجام دادم فقط واسه عکس مشکل دارم چون عکس داخل تگ هست و برام سخته با یه تابع اون تگ هارو جدا کنم چون وقتی تابع رو اضافه می کنم متن رو درمیاره و مسیر عکس رو و تگ عکس رو بهم نمیده
ببخشید مزاحم شما هم شدم
شرمنده
به نظر با preg_match_all بتوانید تمام عکس ها را در قالب آرایه استخراج و سپس آخرین عکس را به عنوان تصویر آخر در کدهایتان استفاده کنید، برای نمونه:
<?php
$messge = file_get_contents('tapspal.txt');
preg_match_all('/background\-image:url\(\'([^\)]+)\'\)\"/i', $messge, $img_url);
//print_r($img_url);
end($img_url[1]);
$img_key = key($img_url[1]);
echo $img_url[1][$img_key];
?>
در صورت نیاز به راهنمایی بیشتر لطفا نمونه سورس خروجی کانال را در قالب فایل txt به آدرس ایمیل ما (موجود در بخش تماس) ارسال و نتیجه را از همان طریق پیگیری کنید.
سیدعباسی
۱۴:۰۷ ۱۴۰۳/۰۵/۰۳
با سلام
من مشکل قبلیم رو که گفتم ارور میده رو حل کردم مشکل بعدیم اینکه با استفاده از این کد
     $doc = str_get_html(get_web_page("https://t.me/s/tapspal"));
$message = $doc->find('.tgme_widget_message_wrap .tgme_widget_message_text', -2)->innertext; // plaintext
متن آخرین مطلب کانالم رو درمیارم الان اگه عکس ضمیمه پست باشه اونو ضمیمه نمی کنه من می خوام آدرس عکس رو هم دربیارم و اونم بفرستم و اگه عکس هم توی متن نبودی یه عکس پیشفرض براش بذارم مثل چند پیام قبلی که براتون ارسال کردم و جوابم رو دادید بعد با متد sendPhoto بفرستم واسه تلگرام چون این متد اگه عکس نداشته باشه متن رو به تنهایی ارسال نمی کنه! تگ عکس داخل این سورس هست
<div class="tgme_widget_message_author accent_color"><a class="tgme_widget_message_owner_name" href="https://t.me/tapspal"><span dir="auto">BitPaL</span></a></div>
<a class="tgme_widget_message_photo_wrap blured 5960593435327053955 1387808806_456245379" href="https://t.me/tapspal/3" style="width:360px; background-image:url('https://cdn4.cdn-telegram.org/file/EWMC2LfVThXwfk4ZxDjE9XjCdfwUuTaofucxy9FC1JaDTS_XlS5RTOitHRZbSd3HDwZuWt9_GDc-fDf-YW9eSuaVleDnKEuqY8_-CNVIvUaiAzZTCSV_FrSoCaJeBW9r_f_E-1WpYSftOy9cK28BU-84LqaX6Muy9Qnv2dBVA-FaWfhIVYtzLcUBw92aShVQMRWqgoptCfky-g3fHsjcN6it70rFyhLyMaY3ZGMjQVL553Y8I4qFBH-uhVe3MiTzj-RqmVnv3KkPL_DT_qYRcWobdOOS0SeH9N1oqHSAWEbYnmegBSf6eTNoojiVQfT0RIPxZ_Ls3zSuxLpAnVmYjQ.jpg')">
<div class="tgme_widget_message_photo" style="width:60%; padding-top:133.33333333333%"></div>
</a>
<div class="tgme_widget_message_text js-message_text" dir="auto"></div>
با تشکر فراوان
اگر الگوی خروجی متغیر message ثابت باشد با نمونه کد زیر می توانید آدرس تصویر را استخراج کنید:
preg_match('/background\-image:url\(\'([^\)]+)\'\)\"/i', $messge, $match);
$img_url = $match[1];

if(!strlen($img_url) > 0){
$img_url = 'http://example.com/default.jpg';
}
بخش آخر کد مربوط به تنظیم تصویر پیش فرض است.
سیدعباسی
۰۵:۳۹ ۱۴۰۳/۰۵/۰۱
با سلام
این کد رو چند روز پیش برام فرستادید و کارم رو راه انداخت
$url = 'http://example.com';

//create a DOM object
$html = file_get_contents($url);

$doc = new DOMDocument();
$doc->loadHTML($html);
$images = $doc->getElementsByTagName('img');
if ($images->length > 0) {
$first_img = $images->item(0);
$image_url = $first_img->getAttribute("src");
}

echo $image_url;
?>
با این میشه عکس ها رو استخراج کرد حالا چطوری میشه متن رو استخراج کرد؟ مثلا متن داخل یک تگ و یا الگو باشه! مثلا توی یک صفحه کامل که لود میشه میخوام بین الگوهایی که لازم دارم متن رو استخراج کنم
با تشکر
برای استخراج محتوای متنی تگ های HTML می توانیم DomXpath را به DomDocument اضافه کنیم، برای بررسی نحوه استفاده و نمونه کدها لطفا در وب جستجو کنید، چند نمونه:
https://www.php.net/manual/en/class.domxpath.php

https://gist.github.com/jmoz/2996220
سیدعباسی
۱۶:۰۶ ۱۴۰۳/۰۴/۲۷
با سلام و تشکر از شما
با توجه به بررسی هایی که انجام دادم استفاده از تگ ها بیشتر در متد sendMessage صورت می گیرد و وقتی از متد sendPhoto استفاده می کنیم تعدادی از تگ ها عمل نمی کنن مثلا blockquote و link preview واسه لینک های سایت
کدها اینا هستن:
$apiUrl = "https://api.telegram.org/bot{$botToken}/sendMessage";
$message = strip_tags("این پیام تست است"."<blockquote>این پیام تست دوم هست!</blockquote>"."\n\n"."https://mysite.com");
$params = [
'chat_id' => $chatId,
'text' => $message,
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if(curl_error($ch)) {
echo 'Error: ' . curl_error($ch);
}
curl_close($ch);

$_text = strip_tags("این پیام تست است"."<blockquote>این پیام تست دوم هست!</blockquote>"."\n\n"."https://mysite.com");

$image_url = 'http://example.com/image.jpg';
$params = [
'chat_id' => $chatId,
'photo' => $image_url,
'caption' => $_text,
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if(curl_error($ch)) {
echo 'Error: ' . curl_error($ch);
}
curl_close($ch);
وقتی متن پیام رو با sendMessage می فرستم تگ ها عمل می کنن ولی وقتی متن پیام رو همرا با عکس با sendPhoto می فرستم تگ هایی که گفتم عمل نمی کنن انگار واسه متد sendPost براشون تعریف نشده الان میشه یه کاری کرد که وقتی متن و عکس رو با هم واسه یه پست می فرستم متن و با متد sendMessage و عکس رو با متد sendPhoto ارسال کرد؟ و یا جوری که بشه تگها توی متد sendPhoto هم عمل کنن
با تشکر از لطف و محبت شما
تا جایی که اطلاع داریم با 2 متد نمی توانیم برای یک مطلب محتوا بفرستیم، طبق بررسی API تلگرام هم شاید اگر پارامتر
parse_mode: 'HTML'
را به متد sendPhoto اضافه کنیم امکان استفاده از برخی تگ های HTML ممکن شود که باید تست کرد.
سیدعباسی
۰۶:۰۴ ۱۴۰۳/۰۴/۲۶
با تشکر از شما
خیلی ممنون مشکلم درست شد فقط یه مشکل دارم چطوری می تونم با php متنی که می نویسم یه قسمت رو نقل قول کنم واسه تلگرام parse_mode رو روی html قرار دادمدواسه همه تگ ها درست عمل می کنه ولی quote رو نمی دونم چیکارش کنم همه نت رو هم زیر رو کردم و چیزی به دست نیاوردم میخوام وقتی با php متن ارسال می کنم یه جایی رو quote کنم استایل خود تلگرام که داخل کادر رنگی هست
با تشکر
ظاهرا متد مستقیمی برای ایجاد نقل قول با ربات هنوز در API تلگرام معرفی نشده است، به عنوان روش جایگزین این راه حل را بررسی کنید:
stackoverflow.com/questions/77426193/how-to-mark-part-of-a-text-as-quoted-in-telegram-sendmessage-bot-api
این روش را تست نکرده ایم.
سیدعباسی
۰۵:۰۱ ۱۴۰۳/۰۴/۲۵
ببخشید برای سوال و کد قبلی که براتون نوشتم میخوام با کد قبلی یک لینک رو بررسی کنم بعد عکسهای اون مطلب رو پیدا کنم اگه عکس jpg و یا png بود یکی رو فقط باهاش انتخاب کنم اگه عکس انتخابی با این فرمت بود یکی رو انتخاب کنم اگه با این فرمت ها نبود لینک یه عکس پیشفرض رو بذارم اگه توی عکسها ۱۰ تا عکس رو پیدا کرد فقط یکی رو میخوام با این دو فرمت چون فقط میخوام یه عکس واسه تلگرام ارسال کنم همه ی عکسهایی که توی متن پیدا می کنه رو بررسی کنه و با همین دو تا فرمت فقط یکی رو انتخاب کنه و فرقی نمی کنه کدوم باشه ولی اگه عکس عکسی رو پیدا نکرد پیشفرض بذارم
با تشکر
برای تنظیم تصویر پیش فرض در صورت پیدا نشدن هیچ تصویری می تواند کد را به صورت زیر توسعه دهید:
if ($images->length > 0) {
} else {
$image_url = 'http://example.com/image/default.jpg';
}
سیدعباسی
۰۱:۱۴ ۱۴۰۳/۰۴/۲۵
با تشکر از شما متوجه شدم
با این کد چطوری میتونم عکس یک مطلب رو دربیارم و لینکش رو جدا کنم؟
<?php
// URL of the website post
$url = 'mysite.com';

// Create a DOM object
$html = file_get_contents($url);

// Find the image element in the DOM
$image = $html->find('img', 0);

// Get the source attribute of the image
$imageUrl = $image->src;

echo $imageUrl;
?>
روی کد ارسال موفق شدم عکس رو با لینک ارسال کنم ولی الان نیاز دارم عکس یک مطلب رو دربیارم بعد همون رو بدم به تابع قبلی که بعنوان لینک برام ارسال کنه! الان فقط مشکل باقی مانده ام اینکه لینک عکس یک مطلب رو استخراج کنم با این کدی که الان نوشتم نتونستم اینکارو بکنم چون به تابع find گیر داد و ارور میده
سپاس
ظاهرا کد شما از یک کلاس خارجی استفاده می کند که فایل آن در دسترس نیست و در صفحه include نشده، با روش جایگزین می توانید بدون استفاده از کلاس تصویر را استخراج کنید:
<?php
//URL of the website post
$url = 'http://example.com';

//create a DOM object
$html = file_get_contents($url);

$doc = new DOMDocument();
$doc->loadHTML($html);
$images = $doc->getElementsByTagName('img');
if ($images->length > 0) {
$first_img = $images->item(0);
$image_url = $first_img->getAttribute("src");
}

echo $image_url;
?>
سیدعباسی
۱۶:۵۹ ۱۴۰۳/۰۴/۲۴
سلام
من دو روز پیش یه کد براتون فرستادم واسه ارسال متن به تلگرام
اونو درست کردم فقط این کد ازش می خوام متن که می فرستم باهاش عکس هم ارسال کنم کدی که الان میذارم واسه رباته خودمه که درسته و api هم درسته هرکاری می کنم ارور میده و نمی فرسته ممنون میشم بررسی و کمک کنید مشکل چیه
<?php
// Replace 'YOUR_BOT_TOKEN' with your actual bot token
$bot_token = 'YOUR_BOT_TOKEN';
$chat_id = '@your_channel_name'; // Replace with your channel username;

// Replace with the path to the picture you want to send
$image_path = 'https://example.com/image.jpg';
$text = 'Hello from your bot!'; // Replace with the text you want to send

// Set up cURL to make a POST request to the Telegram Bot API
$curl = curl_init("https://api.telegram.org/bot$bot_token/sendPhoto");

// Set POST data including the photo file and text
$post_fields = [
'chat_id' => $chat_id,
'photo' => new CURLFile(realpath($image_path)),
'caption' => $text
];
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_fields);

// Execute cURL request
$result = curl_exec($curl);

// Close cURL session
curl_close($curl);

// Check for errors
if ($result === false) {
echo 'Error sending picture and text: ' . curl_error($curl);
} else {
echo 'Picture and text sent successfully!';
}

?>
خیلی ممنون
با new CURLFile نمی توانیم آدرس فایل در سرورهای دیگر را فراخوانی و دریافت کنیم، برای این کلاس باید فایل روی سرور خودمان باشد به فرض:
$image_path = '/images/image.jpg';
که یعنی فایل تصویر در فولدر images در کنار فایل اصلی ربات قرار دارد، در صورت نیاز به استفاده از فایل های آنلاین وب باید ابتدا آنها را دریافت و ذخیره سازی کنیم، به فرض:
$img_url = 'https://example.com/image.jpg';
$image_path = '/images/image.jpg';
file_put_contents($image_path, file_get_contents($img_url));
نکته: موارد شخصی از کدهای شما حذف شدند.
سیدعباسی
۲۱:۴۷ ۱۴۰۳/۰۴/۲۲
با سلام
من مطالب سایتم رو با این تابع به تلگرام ارسال می کنم فقط مشکلی که باهاش دارم اینکه هیچ تگی رو قبول نمی کنه یعنی نه میشه متن رو bold کرد و نه میشه باهاش عکس ارسال کرد بخاطر وجود این تابع urlencode که وقتی پاکش می کنی و یا با تابع دیگه ای جایگزین می کنم اخطار میده و هیچی ارسال نمی کنه ممنون میشم راهنمایی کنید
با تشکر
<?php
// Replace 'YOUR_BOT_TOKEN' with your bot's token
$botToken = 'YOUR_BOT_TOKEN';
$channel = '@your_channel_name'; // Replace with your channel username

// Fetch the content from the website
$content = file_get_contents('https://example.com');

// API URL for sending messages to the channel
$url = "https://api.telegram.org/bot{$botToken}/sendMessage?chat_id={$channel}&text=".urlencode($content);

// Send the message using cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);

// Check the result
if ($result) {
echo "Content sent successfully!";
} else {
echo "Failed to send content.";
}
?>
فرهادی
۰۳:۴۵ ۱۴۰۳/۰۱/۱۰
سلام
ببخشید یه مشکل دارم این صفحه رو نگاه کنید
حذف شد
من میخوام محتوای توضیحات این مطلب رو دربیارم ولی چون
<div class="content">
چند بار توی سورس تکرار شده نمی تونم الگوی توضیحاتش رو استخراج کنم
ممنون میشم کمک کنید
با تشکر
لطفا ضمن مشخص کردن دقیق قسمت مد نظر از خروجی سایت، مشکل را با ایمیل ما مطرح کنید، فقط در صورتی که نوشتن الگو زمانبر نباشد انجام خواهد شد.
فرهادی
۱۶:۴۴ ۱۴۰۳/۰۱/۰۹
با تشکر از شما
یه مشکل دیگه برام پیش اومده واسه این کد
<?php
$string = '<p class="price"><span class="woocommerce-Price-amount amount"><bdi><span class="woocommerce-Price-currencySymbol">&#x062A;&#x0648;&#x0645;&#x0627;&#x0646;</span>&nbsp;15.000</bdi></span></p>';
$data = preg_match('/<p class=\"price\"[^>]*>(.*?)<\\/p>/ims', $string , $match);
echo $match[1];
?>
وقتی echo می گیرم تومان باهاش میاد وقتی میخوام فقط عدد echo گرفته بشه همه ی عددهای این رشته باهاش نشون داده میشه! من میخوام فقط 15000 نشون داده بشه و هیچ چیز دیگه ای توش نباشه!
با تشکر
می توانید الگو را به صورت زیر ویرایش کنید:
$data = preg_match('/<span class=\"woocommerce-Price-currencySymbol[^>]*\">.*<\/span>(.*?)<\/bdi><\/span><\/p>/ims', $string , $match);
echo str_replace('&nbsp;', '', $match[1]);
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، زمانبر، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق مشکل و خطایابی میسر باشد.
- تمام دیدگاه های ارسالی خوانده شده و برای هر کاربر مدت زمان لازم جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.



 refresh
10 × 10
3 × 7
20 × 20
=