یکشنبه ۲۳ مرداد ۱۴۰۱

Sunday, August 14, 2022 GMT +4:30

ارسال و دریافت اطلاعات با متد GET و POST در ای جکس (Ajax)

ajax-asynchronous

به طور کلی ارسال و دریافت اطلاعات در بستر وب با دو متد GET و POST صورت می گیرد که جزئی از استانداردهای تعریف شده پروتکل HTTP هستند و توسط مرورگرها و سرورهای مختلف پشتیبانی می شوند، متد GET معمولا برای ارسال پارامترهای قابل روئیت در آدرس URL درخواستی و دریافت پاسخ از سرور کاربرد دارد، از متد POST نیز به طور معمول در کدنویسی HTML در هنگام کار با فرم ها (تگ form) و ارسال اطلاعات به صورت غیرقابل روئیت استفاده می شود، در ای جکس GET و POST کارکردی مشابه دارند با این تفاوت که در هر دو متد درخواست در پس زمینه ارسال شده و خللی در پیمایش صفحه کاربر ایجاد نمی شود، درک این دو شیوه با توجه به استفاده در بدنه اصلی یک درخواست مبتنی بر ای جکس (Ajax) جهت طی ادامه روند آموزش های این بخش اهمیت زیادی دارد.

متد GET و POST در ای جکس (Ajax)


همانطور که پیش از این گفتیم درخواست های مبتنی بر ای جکس (Ajax) از چند قسمت اصلی تشکیل شده اند (آبجکت XMLHttpRequest، متد open، متد send، متد onreadystatechange و readyState)، آبجکت XMLHttpRequest ساز و کار مورد نیاز را برای ارسال و دریافت اطلاعات بر بستر Ajax فراهم می کند، متد open یک فایل را در سرور با یکی از متدهای GET یا POST فراخوانی کرده و پارامترهای مورد نیاز در قسمت send ارسال می شوند، متد onreadystatechange نیز در کنار متد readyState وضعیت های مختلف را در طی این فرآیند بررسی می کند، با ذکر این ساختار کلی این قسمت از آموزش را به متد open و send اختصاص می دهیم که خود از متدهای GET و POST در پروتکل HTTP استفاده می کنند، به طور خلاصه:
- open و send توابعی در Ajax هستند که برای فراخوانی یک فایل از سرور و ارسال پارامتر به آن از آنها استفاده می کنیم (این توابع را در اصطلاح برنامه نویسی شی گرا، متد می گویند).
- متد open برای فراخوانی فایل از سرور از یکی از شیوه های تعریف شده در پروتکل HTTP استفاده می کند، در پروتکل HTTP دو متد GET و POST برای ارسال و دریافت اطلاعات بین کاربر (Client) و سرور (Server) تعریف شده که جزء استانداردهای این پروتکل هستند.

پارامترهای متد open و send در ای جکس (Ajax)


هر درخواست مبتنی بر ای جکس (Ajax) در نهایت باید یک فایل را از سرور فراخوانی کند، این فراخوانی می تواند با ارسال مقادیر یا بدون ارسال مقادیر باشد، ای جکس برای این نیاز از دو متد open و send استفاده می کند که درخواست ها با این دو متد از طریق استاندارد HTTP و متدهای GET و POST در این استاندارد ارسال و نتیجه دریافت می شود، در نمونه کدهای زیر بخش مربوط به متد open و send از یک درخواست مبتنی بر ای جکس را بررسی می کنیم:
xmlHttp.open("GET", "index.php?action=add&id=22", true);
xmlHttp.send(null);

var params = "action=add&id=22";
xmlHttp.open("POST", "index.php", true);
xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttp.send(params);
همان طور که در نمونه کدهای بالا مشخص است، زمانی که متد GET در قسمت open استفاده می شود، پارامترها از طریق آدرس URL به سرور ارسال می شوند و قسمت send مقدار null یا خالی دارد، اما در حالت استفاده از POST باید تنظیماتی اعمال شود که از جمله استفاده از متد setRequestHeader است، این متد در ای جکس برای تنظیم سربرگ (Header) های HTTP در یک درخواست استفاده می شود، در مثال بالا نیز سربرگ Content-type با مقادیر application/x-www-form-urlencoded تنظیم شده است، این دستور به مرورگر تفهیم می کند که اطلاعات را مانند یک فرم ساده HTML ارسال کند، پارامترها در حالت استفاده از متد POST، هم می توانند از طریق آدرس URL (مشابه متد GET) و هم در بخش send ارسال شوند که هر کدام برای شرایط خاصی مناسب هستند که در ادامه در این رابطه بیشتر خواهیم گفت، پارامتر سوم متد open نیز برای تعیین غیر همزمانی (هم روند یا Asynchronous) بودن یا نبودن درخواست است، در صورتی که این مقدار true باشد در پیمایش صفحه کاربر خللی ایجاد نمی شود اما اگر این مقدار را false تنظیم کنیم، تا زمانی که فرآیند درخواست ای جکس به پایان نرسیده، کاربر نمی تواند در صفحه پیمایش کند.

GET یا POST، کدام متد را استفاده کنیم؟!


GET و POST هر کدام با هدف خاصی در HTTP تعریف شده اند، متد GET برای ارسال پارامترها در آدرس URL به کار می رود و از POST برای ارسال بسته های اطلاعات به صورت غیر قابل روئیت استفاده می شود.
کجا از GET استفاده کنیم؟
- متد GET معمولا برای ارسال پارامترهای دستوری در آدرس URL استفاده می شود، به طور مثال می توانیم شماره ID کاربر یا کلمه جستجو شده را در این متد ارسال کنیم.
- در صورتی که اطلاعات ارسال شده حالت عمومی داشته باشند استفاده از GET مانعی ندارد، به طور مثال ارسال اطلاعات حساس مانند رمز عبور از این طریق توصیه نمی شود چرا که در آدرس URL و به صورت آشکار قابل روئیت خواهد بود.
- در مواردی که نیاز به ذخیره سازی موقت (Cache) اطلاعات باشد GET گزینه مناسبی است (البته این حالت را می توان با برنامه نویسی جاوا اسکریپت به نحو دلخواه تغییر داد).
- متد GET در ای جکس سریعتر از متد POST است و برای موارد عمومی که صرفا نیاز به فراخوانی یک فایل از سرور با Ajax است، گزینه مناسبی است، متد POST در ای جکس به صورت دو مرحله ای عمل می کند (ابتدا سربرگ های HTTP و سپس اطلاعات ارسال می شوند).
جهت آشنایی بیشتر در مثال زیر اطلاعات فرضی را توسط متد GET برای یک فایل PHP با نام ajax-get.php ارسال و پاسخ را در بلاکی با آی دی result خروجی می دهیم:

فایل ajax-get.php


<?php
@$site = $_GET['site'];
@$domain = $_GET['domain'];
echo "نام سایت: $site<br>";
echo "آدرس دامنه: $domain<br>";
echo "متد استفاده شده: GET<br>";
?>

کد HTML درخواست و تنظیمات Ajax


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | ارسال و دریافت اطلاعات با متد GET</title>
<!-- Webgoo.ir -->
<style type="text/css">
body {
    font-family: Tahoma, Geneva, sans-serif;
    direction: rtl;
    font-size: 12px;
}
</style>
<script type="text/javascript">
function ajaxCallFile(id) {
    var xmlHttp;
    
    try {
        //Opera, Firefox, Safari
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        //Internet Explorer
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                alert("متاسفانه مرورگر شما از ای جکس پشتیبانی نمی کند");
                return false;
            }
        }
    }
    xmlHttp.onreadystatechange = function () {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            document.getElementById(id).innerHTML = xmlHttp.responseText;
            document.getElementById('button-1').innerHTML = 'ارسال درخواست ای جکس';
            document.getElementById('button-1').disabled = false;
        } else {
            document.getElementById('button-1').innerHTML = 'لطفا چند لحظه صبر کنید...';
            document.getElementById('button-1').disabled = true;
        }
    }
    
    xmlHttp.open("GET", "ajax-get.php?site=Webgoo&domain=https://webgoo.ir", true);
    xmlHttp.send(null);
}
</script>
</head>
<body>
<noscript>
جاوا اسکریپت در مرورگر شما غیر فعال است!<br>
</noscript>

<button id="button-1" type="button" onclick="ajaxCallFile('result')">ارسال درخواست ای جکس</button>
<div id="result"></div>
<hr>
پس از کلیک بر روی دکمه بالا، تابع جاوا اسکریپتی فراخوانی شده و درخواست ای جکس به فایل PHP در سرور ارسال می شود، سپس نتیجه دریافت و در بلاک نمایش داده خواهد شد، در این مثال از متد GET استفاده شده است.
</body>
</html>
پیش نمایش
متد POST در ای جکس شباهت زیادی به GET دارد، با این تفاوت که در این شیوه درخواست، مانند تگ form در HTML سربرگ های HTTP یا HTTP Headers نیز به مرورگر ارسال می شوند، از طرفی xmlHttp.send به جای مقادیر null، پارامترهایی با مقادیر رشته ای دارد.
کجا از POST استفاده کنیم؟
- در ای جکس هرکجا نیاز به ارسال اطلاعات حساس مانند نام کاربری، کلمه عبور، مشخصات حساب بانکی و... باشد، بهتر است از POST استفاده کنیم، چرا که اطلاعات در این شیوه در آدرس URL قابل روئیت نیست.
- برای ارسال اطلاعات حجیم (به طور مثال اطلاعات یک فرم HTML) از POST استفاده می شود، متد GET از نظر میزان اطلاعات مجاز با محدودیت های بیشتری در مقایسه با POST روبرو است.
جهت آشنایی بیشتر در مثال زیر اطلاعات فرضی را توسط متد POST برای یک فایل PHP با نام ajax-post.php ارسال و پاسخ را در بلاکی با آی دی result خروجی می دهیم:

فایل ajax-post.php


<?php
@$site = $_POST['site'];
@$domain = $_POST['domain'];
echo "نام سایت: $site<br>";
echo "آدرس دامنه: $domain<br>";
echo "متد استفاده شده: POST<br>";
?>

کد HTML درخواست و تنظیمات Ajax


<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>وبگو | ارسال و دریافت اطلاعات با متد POST</title>
<!-- Webgoo.ir -->
<style type="text/css">
body {
    font-family: Tahoma, Geneva, sans-serif;
    direction: rtl;
    font-size: 12px;
}
</style>
<script type="text/javascript">
function ajaxCallFile(id) {
    var xmlHttp;
    
    try {
        //Opera, Firefox, Safari
        xmlHttp = new XMLHttpRequest();
    } catch (e) {
        //Internet Explorer
        try {
            xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            try {
                xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (e) {
                alert("متاسفانه مرورگر شما از ای جکس پشتیبانی نمی کند");
                return false;
            }
        }
    }
    xmlHttp.onreadystatechange = function () {
        if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {
            document.getElementById(id).innerHTML = xmlHttp.responseText;
            document.getElementById('button-1').innerHTML = 'ارسال درخواست ای جکس';
            document.getElementById('button-1').disabled = false;
        } else {
            document.getElementById('button-1').innerHTML = 'لطفا چند لحظه صبر کنید...';
            document.getElementById('button-1').disabled = true;
        }
    }
    
    xmlHttp.open("POST", "ajax-post.php", true);
    xmlHttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
    xmlHttp.send('site=Webgoo&domain=https://webgoo.ir');
}
</script>
</head>
<body>
<noscript>
جاوا اسکریپت در مرورگر شما غیر فعال است!<br>
</noscript>

<button id="button-1" type="button" onclick="ajaxCallFile('result')">ارسال درخواست ای جکس</button>
<div id="result"></div>
<hr>
پس از کلیک بر روی دکمه بالا، تابع جاوا اسکریپتی فراخوانی شده و درخواست ای جکس به فایل PHP در سرور ارسال می شود، سپس نتیجه دریافت و در بلاک نمایش داده خواهد شد، در متد POST از متد setRequestHeader استفاده و پارامترها در قسمت send تنظیم و ارسال می شوند، در این مثال از متد POST استفاده شده است.
</body>
</html>
پیش نمایش
ارسال پارامترها در ای جکس صرفا به روش ثابت مانند نمونه کدهای بالا محدود نمی شود، در آموزش های بعدی خواهیم دید که چگونه می توان به نحو حرفه ای تر و با قابلیت تعاملی بیشتر به صورت پویا از قابلیت های ای جکس در طراحی امکانات و رابط کاربری برنامه های تحت وب استفاده کرد.
دسته بندی: آموزش مقدماتی » Ajax
related مطالب بیشتر:
نمایش پیام در حال بارگذاری با ای جکس (Ajax)
آموزش ای جکس (Ajax)، تکنیک غیرهمزمانی در وب
نمایش افکت fade in با ای جکس (Ajax)
فریم ورک های ای جکس (Ajax Frameworks)
ذخیره و نمایش اطلاعات فایل با ای جکس (Ajax) و PHP
دیدگاه
more ۵۴ دیدگاه برای این مطلب ارسال شده است.
more دیدگاه جدید بر اساس تاریخ ارسال در انتهای دیدگاه های موجود نمایش داده می شود.
نویسنده: mahdi
۲۳:۱۶ ۱۴۰۰/۰۲/۰۳
سلام استاد عزیز میخوام برای ایجکس یه تابع برای استفاده مجدد بنویسم ، هدرهارو مثل این پایینی
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
چطوری بهش انتقال بدم؟
یا اینارو باید در همون تابع اصلی بصورت پیشفرض بنویسم؟
البته استاد عزیز شاید سوالم ساده باشه ولی دیگه آخر شبه خیلی خسته شدم گفتم از شما بپرسم خیلی ممنون استاد عزیز ، سلامت و موفق باشی
پاسخ: 
یک راه که به ذهن می رسد این است که هدرهای مد نظر را در تابع ای جکس به صورت switch و case داشته باشید و یک آرگیومنت هم در نظر بگیرید که به فرض مقدار عددی داشته باشد (آرگیومنت را به عنوان case بررسی کنید)، در هنگام فراخوانی به جای انتقال کل هدر صرفا شماره مورد نظر را تنظیم و هدر برای درخواست جاری ارسال شود.
نویسنده: mahdi
۱۰:۱۲ ۱۴۰۰/۰۲/۰۵
سلام ، استاد عزیز اگر هدرها رو بصورت زیر ارسال کنیم آیا همشون اعمال میشن یا فقط آخری اعمال میشه؟
load({
.........,
headers : [
"Content-type:application/x-www-form-urlencoded",
"Content-type:application/json",
]
})

function load(data)
.........
if(data.headers){
var i,h;
for(i=0; i< data.headers.length; i++){
h = data.headers[i].split(":");
xhr.setRequestHeader(h[0],h[1]);
}
}
}
و چطوری چک کنم ببینم همشون اعمال میشن یا نه؟
استاد عزیز دو سه روز پیگیر ایجکس شدم و با ایجکس ساده و فچ و بصورت پرامیس و اکسیوس آشنا شدم و میبینم خیلیاشون اصلا در هیچکدوم از نسخه های ie ساپورت نمیشن بعد من کلا گیر دادم که تا ie9 رو رعایت کنم ، آیا من توهم زدم استاد عزیز و کلا دیگه هیچکس از ie استفاده نمیکنه و باید بیخیالش بشم؟
شایدم چون تازه کارم و یه سری مطلب های آموزشی رو میبینم که برای خیلی وقت پیشه دچار این توهم شدم؟
خیلی ممنون استاد عزیز سلامت و موفق باشی
پاسخ: 
تا آنجا که اطلاع داریم در درخواست های متداول Ajax معمولا یک Content-type مورد نیاز است مگر اینکه با پروتکل های ارسال ایمیل کار کنید که در آنجا بحث Boundary مطرح می شود و مباحث جداگانه ای دارد، در این نمونه کد احتمالا فقط مورد آخر تنظیم و ارسال می شود (تست نکرده ایم) که می توانید در هنگام ارسال درخواست با زدن دکمه F12 مرورگرها از بخش Console سربرگ ها را بررسی کنید، در مورد بحث IE اگر چند سال پیش سوال را مطرح می کردید شاید هنوز پافشاری می کردیم اما در حال حاضر تعداد کاربران نسخه های مختلف این مرورگر خیلی خیلی پائین و همچنان رو به کاهش است پس برای استفاده از فناوری ها و متدهای جدیدی که در دیگر مرورگرها شامل Edge پشتیبانی می شود تردید نکنید، پشتیبانی از IE می تواند در حد شکل ظاهری و رابط کاربری سایت اصلی باشد اما امکانات و سرویس های خاص می توانند دیگر از IE پشتیبانی نکنند (بهینه این است که پیام هشداری به کاربر نمایش داده شود) چون وب امروز نیاز به فناوری های جدید دارد و تغییراتی نسبت به قبل داشته است.
نویسنده: meysam
۰۱:۳۷ ۱۴۰۰/۰۲/۱۷
سلام ممنون میشم کمکم کنید
من یه کد ساده میخوام که وقتی اطلاعات به صورت get بهش ارسال شد بررسی کنه ببینه ایا تو دیتابیس و اون تیبل ایا موجود هست یا نه اگه بود ok برگردونه اگه نبود no ممنون میشم اگه کدش رو دارین ارسال کنید.
متد به صورت زیر قراره ارسال بشه :
http://exmple.com/check.php?code='url='.$siteurl
پاسخ: 
ظاهرا URL شما ایراد دارد و پارامتر code به درستی تنظیم نشده است، احتمالا باید به شکل نمونه زیر باشد:
'http://exmple.com/check.php?code=' . $yourcode . '&url=' . $siteurl
در هر صورت برای اجرای پرس و جوی دیتابیس ابتدا باید از طریق کنترل پنل هاست (cPanel، DirectAdmin و...) پایگاه داده و نام کاربری جهت اتصال ایجاد کرده باشید سپس از کدی مشابه نمونه زیر با توجه به نامگذاری جدول و ستون ها استفاده کنید:
<?php
//دریافت پارامتر ها
@$code = $_GET['code'];
@$site = $_GET['site'];

function checkDBValueExit($code, $site){
$result = false;

//اتصال به دیتابیس
$conn = mysqli_connect("localhost", "username", "password", "dbname");
if(!$conn){
echo "PHP & MySQL Connection: Error! " . mysqli_connect_errno() . ' - ' . mysqli_connect_error();
exit;
} else{
//سازگاری با حروف فارسی
$sql = "SET NAMES 'utf8'";
$query = mysqli_query($conn, $sql);

//ایمن سازی پارامترها
$code = mysqli_real_escape_string($conn, $code);
$site = mysqli_real_escape_string($conn, $site);

//اانتخاب اطلاعات از جدول و ستون ها
$sql = "SELECT id FROM tbl_1_name WHERE code = '$code' AND site = '$site' LIMIT 1";
$query = mysqli_query($conn, $sql);

if(!$query){
echo "Selecting From Table tbl_1_name: Error! " . mysqli_error($conn) . '<br>';
} else{
//تعداد ردیف های انتخاب شده
$count = mysqli_num_rows($query);

//پردازش و خروجی ردیف های اطلاعات
if($count > 0){
$result = 'ok';
} else{
$result = 'no';
}
}
}

//پایان اتصال
mysqli_close($conn);

return $result;
}

echo checkDBValueExit($code, $site);
?>
در این کد باید اطلاعات اتصال شامل نام کاربری و کلمه عبور، نام دیتابیس و جدول جایگزین قسمت های username، password، dbname و tbl_1_name شود، همچنین فرض بر این است که هر دو مقدار code و site باید در جدول مطابق با اطلاعات ارسالی باشند تا ok برگردانده شود، اگر به فرض به site نیازی نیست می توانید قسمت زیر را از پرس و جو حذف کنید:
AND site = '$site'
همچنین ستون id جهت بررسی در پرس و جو استفاده شده است که باید هم نام با ستونی در جدولتان باشد.
نویسنده: سعید خسروی
۰۷:۵۷ ۱۴۰۱/۰۴/۱۸
با سلام و خسته نباشید
برای دریافت عنوان وبلاگهای blog.ir از file_get_content استفاده می کنم برای وبلاگهایی که https هستند لینکها رو ریدایرکت میکنم که عنوان رو دریافت کنه، ولی بعضی از وبلاگها دامنه اختصاصی بهشون وصله که اس اس ال ندارن و عنوان رو دریافت نمی کنه و ارور
308 permanent redirect
میده آیا راهی وجود داره که عنوان هر دو نوع وبلاگ رو بدون مشکل دریافت کنه؟
با تشکر
$_link = Rh::file_get_contents(str_replace('http://', 'https://', $link));
$title = preg_match('/<title>(.*?)<\\/title>/ims', $_link, $match);
if( ! empty($title))
$new->title = strip_tags($match[1]);
پاسخ: 
لطفا آدرس یک وبلاگ را که امکان دریافت عنوان آن وجود ندارد درج کنید تا تست و بررسی ها انجام شود.
نویسنده: سعید خسروی
۱۰:۴۳ ۱۴۰۱/۰۴/۱۸
با سلام مجدد
ببینید این ادرس
حذف شد
وبلاگ است که دامین داره چون من همه دامین ها رو با هم میزنم مشخص نمی شه کدوم دامین خودش رو داره و کدوم ساب دامین بلاگ بیان است. و ممکنه دامین ها هم اس اس ال داشته باشند و یا نداشته باشند برای همین نمی دونم چیکار باید کرد برای ساب دامین ها ریپلیس میکنم و اون تایتیل رو می گیره
str_replace('http://','https://',$link));
فقط برای دامین هایی که اس اس ال نداره کار نمی کنه و این ارور میده:
308 permanent redirect
وقتی من عنوان وبلاگها رو دریافت می کنم در لحظه ممکنه 20 تا رو با هم چک کنه بصورت خودکار از این صفحه
https://blog.ir/changes
وبلاگهایی که بروز شدن عنوان ها رو می گیره و
$link
تک تک هر کدوم از وبلاگها است
پاسخ: 
برای جدا کردن وبلاگ ها از سایت های شخصی به نظر می توانید به صورت زیر شرط بگذارید:
<?php
$link = 'http://example.com';
if(strpos($link, 'blog.ir') !== false) {
$_link = Rh::file_get_contents(str_replace('http://', 'https://', $link));
} else {
$_link = Rh::file_get_contents($link);
}
$title = preg_match('/<title>(.*?)<\\/title>/ims', $_link, $match);
if(!empty($title))
$new->title = strip_tags($match[1]);
?>
نویسنده: سعید خسروی
۱۱:۲۴ ۱۴۰۱/۰۴/۱۸
از لطف و محبت شما بسیار ممنون و سپاسگزارم
درست شد
وبلاگی که برای نمونه گذاشته بودم می تونید لینکش رو پاک کنید تبلیغ براش حساب نشه و یا بعدا نگه چرا وبلاگ من اینجا نوشتید
عید قربان هم بهتون تبریک عرض می کنم
با تشکر فراوان
پاسخ: 
آدرس وبلاگ حذف شد، متقابلا خدمت شما تبریک عرض می کنیم.
نویسنده: سعید خسروی
۱۵:۳۴ ۱۴۰۱/۰۴/۱۸
ببخشید بازم مزاحم شدم شرمنده
یه سوال دیگه هم داشتم اگه بخواهیم داده داخل
<meta name="description" content="text">
رو که تگ بسته نداره بگیریم چطوری میشه؟
آیا ممکنه؟
با تشکر
پاسخ: 
با تابع preg_match به صورت نمونه زیر می توانیم محتوای متاتگ description را استخراج کنیم:
<?php
$link = 'https://webgoo.ir';
$_link = file_get_contents($link);
preg_match('/<meta\s+name\s*=\s*"description"\s+content\s*=\s*"(.*?)"\s*\/?>/ims', $_link, $match);
$mata_description = $match[1];
echo $mata_description;
?>
یک تابع اختصاصی هم در PHP برای استخراج متاتگ ها وجود دارد:
get_meta_tags

https://www.php.net/manual/en/function.get-meta-tags.php
نویسنده: سعید خسروی
۱۸:۱۹ ۱۴۰۱/۰۴/۱۸
با تشکر از شما خیلی عالی بود خدا خیرتون بده ماشاءالله توی کارتون خیلی حرفه ای هستید خدا به خودتون و تموم عزیزانتون سلامتی بده انشاءالله تابعی که گفتید سعی می کنم یادش بگیرم واسه خروجی نهایی:
echo strip_tags(str_replace('" />','',$mata_description));
تابع رو اینطوری کردم چون واسه سایتهایی که میخواستم
" />
رو هم نشون میداد، واسه سایت شما درست بود فقط واسه سایت خودم دیدم با خروجی استایل قالب رو هم می گیره توی الگو اگه
" />
رو بهش اضافه کنیم که از دستور str_replace استفاده نشه چطوری الگو رو تغییر بدیم!
ماشاءالله اونطوری که شما الگو رو نوشتید و جواب داد ذهن من قفل کرد!
پاسخ: 
خواهش، الگوی قبلی با افزودن عبارت زیر به انتها ویرایش شد:
\/?
لطفا تست کنید اگر مشکلی داشت اصلاح کنیم.
نویسنده: سعید خسروی
۰۳:۰۳ ۱۴۰۱/۰۴/۱۹
خیلی ممنون خدا خیرتون بده درست شد و مشکلی نداره
فقط یک سوال:
نوشتن متاتگ ها اینطوری نوشته بشه مشکلی داره؟
<meta name="description" content="Free Web tutorials" /‌>
چون وقتی توی سایت خودم از متاتگ هاش خروجی می کردم با الگوی اولیه شما که برای سایت شما درست بود برای سایت من قسمتی از استایل رو هم می آورد! ولی واسه سایت شما مشکلی نداشت! سایت شما بصورت:
<meta name="description" content="Free Web tutorials">
نوشته شده! آیا نوشتنش بصورت سایت خودم مشکلی برای سئو ایجاد نمی کنه؟!
با تشکر
پاسخ: 
خیر اگر از XHTML یا HTML نسخه 5 استفاده می کنید هیچ مشکلی ندارد، مشکل نمایش موارد اضافه در خروجی از کامل نبودن الگو بود، نوشتن عبارت باقاعده ای که دقیقا نه کم نه زیاد قسمت مد نظر را استخراج کند نیازمند در نظر گرفتن تمام حالت های ممکن است که حالت / (اسلش) در انتها لحاظ نشده بود.
more لطفا پیش از ارسال دیدگاه نکات زیر را مد نظر داشته باشید:
- به سوالات کلی، مبهم و مشکلاتی که تلاشی برای رفع آنها نکرده باشید پاسخ مختصر داده شده یا به بخش برنامه نویسی اختصاصی ارجاع داده می شوند.
- کدها و اسکریپت های طولانی را ترجیحا در یک صفحه وب آنلاین یا به صورت حساب موقت و آزمایشی قرار دهید تا امکان بررسی دقیق و خطایابی میسر باشد.
- تمام دیدگاه ها خوانده شده و برای هر کاربر مدت زمان محدودی جهت پاسخگویی در نظر گرفته می شود، لطفا از طرح سوالات متعدد در بازه زمانی کوتاه خودداری کنید.
- در مواردی که امکان رفع مشکل در زمان متداول میسر نباشد ممکن است نیاز به ارجاع و ثبت سفارش در بخش برنامه نویسی باشد که در اینصورت اطلاع رسانی خواهد شد.



 refresh
10 × 10
5 × 3
20 × 20
=
آخرین دیدگاه ها
more برای دسترسی سریع به یادداشت مربوطه می توانید از لینک مطلب در کادر زیر استفاده کنید.
دانیال
در:
سلام مجدد این شکلی وارد می کنم
۱۴۰۱/۰۵/۲۳

دانیال
در:
سلام، ببخشید من برای تبدیل لینک این کد رو در htaccess نوشتم آدرس کار می کند ولی مشکل این هست که php به من...
۱۴۰۱/۰۵/۲۲

ali
در:
با سلام کلا دستورات جاوا اسکریپ رو چطوری باید به قالب های آماده وردپرس اضافه کنیم؟ مثلا innerHtml که استایل های داخل Html را...
۱۴۰۱/۰۵/۲۲

امیر
در:
با سلام و درود بر شما استاد بسیار عالی بود کارم درست شد از لطف و محبتتون بسیار ممنون و سپاسگزارم در...
۱۴۰۱/۰۵/۱۵

امیر
در:
با سلام و خسته نباشید استاد من دو تا اکشن دارم editp و editpost دسترسی کاربران رو به این دو تا اکشن تعریف کردم...
۱۴۰۱/۰۵/۱۳

امیرحسین
در:
سلام وقت بخیر، من میخواستم داخل شی گرایی php وقتی یک متودی صدا زده میشه چک کنه ببینه اجازه اجرا شدنو داره یا خیر یعنی...
۱۴۰۱/۰۵/۱۲

امیرحسین
در:
سلام استاد وقت بخیر من یه الگویی نوشتم: هر چقدر تعداد داشت محدودیتی نداشته باشه و تک تک عدد های بین کاما را...
۱۴۰۱/۰۵/۰۹

سعید
در:
باسلام با تشکر از شما درست بود و مشکلی نداشت در پناه خدای بزرگ باشید
۱۴۰۱/۰۵/۰۸

سعید
در:
با سلام و خسته نباشید شرط های زیر رو نگاه کنید: اگه دقت کنید می بینید که جفت شرط ها شبیه هم هستند....
۱۴۰۱/۰۵/۰۷

majid
در:
سلام ممنون از آموزشتون اگر بخوایم درون کامنت سایت های خارجی هم لغت لینک دار وارد کنیم با این کدها میشه؟
۱۴۰۱/۰۵/۰۲

امید سلمانی
در:
برای لینک دار کردن عکس از چه خروجی در html استفاده کنیم برای ذخیره سازی من ذخیره می کنم ولی عکس html است من می...
۱۴۰۱/۰۵/۰۲

پـــرتو
در:
چشم در اولین فرصت ارسال می کنم
۱۴۰۱/۰۴/۳۰

پرتو
در:
بعد دیگ اینک یه سوال این رنگ پس زمینه ابی رنگ توی نوار منو افقی کجاست یعنی اینک رنگش کدومه ممنون میشم بگین منتظر جوابتون...
۱۴۰۱/۰۴/۲۸

پرتو
در:
سلام خسته نباشید ببخشید بلاگفا از شمام قطعه یا فقط مال من اینطوریه بعد اینک درست میشه یا نه؟
۱۴۰۱/۰۴/۲۸
  در انتظار بررسی: ۰
 پاسخگویی به سوالات ممکن است تا 24 ساعت زمان ببرد.