• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل با حروف فارسی در اعتبار سنجی آدرس
#1
سلام

من با کد زیر :
کد پی‌اچ‌پی:
(filter_var($urlFILTER_VALIDATE_URL) === false
آدرس‌های ارسالی کاربر رو چک می‌کنم.
با آدرس‌هایی که بصورت فارسی هستند مشکل داره و مقدار false رو برمیگردونه.
ایا تابع filter_var از حروف فارسی پشتیبانی نمی‌کنه ؟
راه حل سازگارکردنش با حروف فارسی چیه ؟
همیشه برای یادگیری، موضوعاتی هست!

فرهاد حسن پور / بیرگیک

  پاسخ
تشکر شده توسط :
#2
سلام خیر این تابع حروف فارسی را ساپورت نمیکند برای اینکه شما بتونید آدرس هاتون رو مدیریت کنید باید یک پترن بنویسید و با preg_match مقایسه کنید مثل پترن زیر
کد پی‌اچ‌پی:
// check if URL is valid format
$pattern '/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)[email protected])?
([\d\w]([-\d\w]{0,253}[\d\w])?\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.,\d\w]|%[a-fA-f\d]{2,2})*)*
(\?(&?([-+_~.,\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.,\/\d\w]|%[a-fA-f\d]{2,2})*)?$/u'

$isLink preg_match($pattern$url); // Returns true if a link                   ^see 

این پترن رو تست کنید
  پاسخ
تشکر شده توسط : farhadhp ayoubsys
#3
ممنون ولی این پترن شما کار نکرد.

آدرس من بصورت زیر است :
کد پی‌اچ‌پی:
$url "http://www.farhadhp.ir/%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-zombie-hunter-apocalypse-2-3-6--%D8%A8%D8%A7%D8%B2%DB%8C-%D8%B4%DA%A9%D8%A7%D8%B1%DA%86%DB%8C-%D8%B2%D8%A7%D9%85%D8%A8%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF--%D9%85%D9%88%D8%AF.html";
    
$url urldecode($url); 

و میخوام چک کنم ببینم متغییر $url یک ادرس اینترنتی هست یا خیر.
اینکار رو با تابع filter_var انجام داده بودم. و برای لینک‌هایی که تماما از حروف انگلیسی تشکیل شده بودند کار می‌کرد اما برای لینک‌های که کاراکتر فارسی بکار رفته کار نمی کند.

- من از پترین شما هم استفاده کردم و در همه حالات مقدار 0 را بر میگرداند.


من پترن شما رو بررسی کردم و بخاطر ۳ تا اینتر اضافی کار نمیکرد و با حذف اونا کار کرد.
ولی یک مشکل دیگه پیش اومد. اینکه اگر لینک بدون پروتکل (http / https) باشه هم مقدار ۱ رو بر میگردونه.
می خوام پروتکل هم جز پترن باشه و تکه کد زیر رو به اول پترن اضافه کردم ولی باعث خراب شدن آن شد :‌


کد پی‌اچ‌پی:
/\b(?:(?:https?|ftp):\/\/|www\.) 
همیشه برای یادگیری، موضوعاتی هست!

فرهاد حسن پور / بیرگیک

  پاسخ
تشکر شده توسط :
#4
کد پی‌اچ‌پی:
<?php

$pattern 
'/^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)[email protected])?([\d\w]([-\d\w]{0,253}[\d\w])?\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.,\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.,\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.,\/\d\w]|%[a-fA-f\d]{2,2})*)?$/u'
$method '/((http|https)\:\/\/)/';
$url 'http://www.test.com/فرشاد-نگوتی';
if(
preg_match($pattern$url) && preg_match($method$url))
{
    echo 
'url true';
}
else
{
    echo 
'url corrected';
}
?>
  پاسخ
تشکر شده توسط : Y.P.Y farhadhp ayoubsys
#5
در ادامه توضیحات Kasbookar

نکته:
بر اساس قوائد RFC، نوع کاراکتر استاندارد URL همیشه US-ASCII بوده و هر نوعی دیگه نامعتبر/invalid هستش.
لذا مرورگرها برای سازگاری با انواع متون غیر ASCII اونهارو encode می کنن... مثلا واژه "سلام" تبدیل میشه به "%d8%b3%d9%84%d8%a7%d9%85" (که تازه استاندارد/valid میشه) و بعد فرستاده میشه سمت سرور

بنابراین:
تابع filter_var با پارامتر FILTER_VALIDATE_URL دقیق هستش و بررسیش رو بدرستی انجام میده
پس کافیه URL ورودی رو توسط تابع urlencode یا rawurlencode انکود کنی و بعد با VALIDATE_URL بررسیش کنی

تفاوت urlencode با rawurlencode:
urlencode: فاصله رو به + تبدیل میکنه، در آخر رشته بایت /0 قرار میده و بهتره برای query string استفاده بشه.
rawurlencode: فاصله رو به 20% تبدیل می کنه و بهتره برای path استفاده بشه.

کد پی‌اچ‌پی:
echo ('http://domain/' rawurlencode('my/path to/somewhere with space/') . '/article.php?title=' urlencode('how to be a x')); 
وبلاگ: Yousha.Blog.ir


 کد کمتر => خطای کمتر => قابل فهمتر => خوانایی بالاتر => نگهداری بهتر

  پاسخ
تشکر شده توسط : kasbookar farhadhp Alaa sara147 ayoubsys


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان