سؤال

لدي أشخاص ينشرون عنوان موقع الويب الخاص بهم ولكن يتم نشر أشكال مختلفة مثل:

عندما أقوم بالارتباط بعنوان بدون http:// فإنه يأخذ الرابط كرابط داخلي

<a href="theirsite.com">their site</a>

إرسال الأشخاص إلى شيء مثل: http://mysite.com/thiersite.com

هناك خيار آخر جربته وهو الارتباط بشيء مثل mysite.com/?link=theirsite.com - وبهذه الطريقة يمكنني القيام ببعض تتبع الارتباطات وما إلى ذلك ثم إعادة توجيه الأشخاص إلى الرابط ولكن به نفس المشكلة:

//do some tracking etc here
$link =$_GET['link'];
header("Location: $link");
هل كانت مفيدة؟

المحلول

ليست هناك حاجة لاستخدام التعبيرات العادية هنا.يحتوي PHP على التحقق من صحة عنوان URL المدمج.

مرشح فار

var_dump((bool) filter_var('http://www.website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));
var_dump((bool) filter_var('http://website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));
var_dump((bool) filter_var('www.website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));
var_dump((bool) filter_var('website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));

انتاج |

bool(true)
bool(true)
bool(false)
bool(false)

من فضلك لا تنتقل مباشرة إلى التعبيرات العادية للتحقق من صحتها، PHP لديها الكثير من الأساليب المضمنة للتعامل مع هذه السيناريوهات.

-ماثيو

نصائح أخرى

ضع "http://" في الحقل افتراضيًا، ثم تحقق من صحة عنوان URL باستخدام شيء مثل

if(eregi("^((http|https)://)?([[:alnum:]-])+(\.)([[:alnum:]]){2,4}([[:alnum:]/+=%&_.~?-]*)$", stripslashes(trim($_POST['link'])))){
    //link is valid
}

إذا لم يتم التحقق من صحة الرابط، فما عليك سوى طباعة رسالة تقول "الرابط الذي أدخلته غير صالح، تأكد من أنه يبدأ بـ 'http://'"

يرجى ملاحظة أن هناك فرقًا حقيقيًا بين www.site.com و site.com, ، عادةً ما يعمل كلاهما، ولكن في بعض مواقع الويب يؤدي كل منهما إلى مسار مختلف (بعض مواقع الويب المحددة بشكل سيء لن تعمل بدون www على سبيل المثال).لذلك لا يمكنك دائمًا إضافة "www" إلى الإدخال.

ملاحظة أخرى، قم بالتعامل مع المساحة المعلقة، لذلك ' http://' لن يتم إضافة المزيد مسبقًا http://.

الحل القائم على Javascript Regex

'http://'+field.replace(/^ *http:\/\//,'')

يمكنك التحقق من ذلك على حجم العميل، فقط ضع رمزًا بنفس الروح على onSubmit من النموذج الخاص بك.

سأستخدم شيئًا مثل هذا:

$link = str_replace(array("\r", "\n"), '', trim($link));
if (!preg_match('/^https?:\/\//', $link)) {
    $link = 'http://'.$link;
}
header('Location: '.$link);

طريقة أخرى ستكون parse_url وظيفة لتحليل عنوان URL المحدد، راجع الأجزاء المفقودة وأضفها.

سأقدم بعض التحقق أو الصرف الصحي.استخدم التعبير العادي لمعرفة ما إذا كان http:// يبدأ به.إذا لم يحدث ذلك، فإما أن تظهر خطأ في التحقق من الصحة أو تضع http:// في البداية.

if not "://" in users_url:
    users_url = "http://" + users_url

...أو ما يعادله باللغة التي تختارها.

يمكنك استخدام التعبيرات العادية لاختبار الإدخال

Regex exp = new Regex(
    @"http://(www\.)?([^\.]+)\.com",
    RegexOptions.IgnoreCase);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top