Menu
flag Ar iconالعربيةdown icon

filter_var() في PHP: التحقق من البريد والأعداد والروابط

تعيد filter_var($value, FILTER_VALIDATE_EMAIL) القيمة إذا كانت صالحة وfalse إذا لم تكن؛ وتعمل FILTER_VALIDATE_INT وFILTER_VALIDATE_URL وFILTER_VALIDATE_BOOL وFILTER_VALIDATE_IP بالطريقة نفسها. تعلّم الخيارات (min_range وdefault)، والأعلام، ومرشحات التنقية، وفخ false مقابل 0.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

تعيد filter_var($value, FILTER_VALIDATE_EMAIL) القيمة حين تكون عنوان بريد إلكتروني صالحًا وfalse حين لا تكون. بدّل المرشح لفحص صيغ أخرى: FILTER_VALIDATE_INT وFILTER_VALIDATE_FLOAT وFILTER_VALIDATE_URL وFILTER_VALIDATE_BOOL وFILTER_VALIDATE_IP. وقارن النتيجة دائمًا بـ === false.

نتيجتان تفاجئان الناس. يُرفض ada@example لأن النطاق ليس فيه نقطة، ويُرفض ' ada@example.com' بسبب المسافة البادئة، لذا طبّق trim() على المُدخلات قبل التحقق منها.

التحقق من بريد إلكتروني قادم من نموذج

الفحص نفسه خلف نموذج. شغّله، واكتب عنوانًا واضغط Check؛ تعمل الكتلة مرة أخرى مع مُدخلك في $_POST.

لا يفحص FILTER_VALIDATE_EMAIL إلا الشكل. يمر nobody@example.com، وكذلك سيمر عنوان فيه خطأ إملائي في النطاق. وتُرفض المحارف غير ASCII: لا يمر adä@example.com إلا مع FILTER_FLAG_EMAIL_UNICODE، الذي يسمح بها قبل @، ويفشل نطاق مثل exämple.com حتى مع العلم ما لم تحوّله إلى صيغة xn-- أولًا. والطريقة الوحيدة لمعرفة أن العنوان يعمل هي إرسال رابط تأكيد إليه.

التحقق من عدد صحيح، مع min_range وmax_range

يحوّل FILTER_VALIDATE_INT النص الصالح إلى int ويرفض كل ما عداه. وتضيف مصفوفة الخيارات نطاقًا وقيمة افتراضية:

تُقبل المسافات المحيطة وعلامة + البادئة، ولا يُقبل الصفر البادئ ('042')، والنتيجة لـ '42' هي العدد الصحيح 42 لا النص. والقيمة خارج النطاق تعطي false؛ ومع الخيار default تحصل على القيمة الافتراضية بدل false، وهذا مفيد لأشياء مثل ?page= (راجع GETو_GET و_POST). أضف FILTER_FLAG_ALLOW_HEX أو FILTER_FLAG_ALLOW_OCTAL لقبول 0x1A أو 0755.

فخ 0 وfalse

تعيد '0' الصالحة العدد الصحيح 0، و0 خاطئ منطقيًا. وتعامله if البسيطة على أنه فشل:

وينطبق الأمر نفسه على FILTER_VALIDATE_FLOAT ('0.0') وFILTER_VALIDATE_BOOL، حيث تكون false إجابة صحيحة. ولهذا وُجد FILTER_NULL_ON_FAILURE.

القيم المنطقية والأعداد العشرية والروابط وعناوين IP

FILTER_VALIDATE_BOOL هو اسم PHP 8؛ وFILTER_VALIDATE_BOOLEAN هو المرشح نفسه. ودون FILTER_NULL_ON_FAILURE، ستعيد 'maybe' القيمة false، فلا يمكن تمييزها عن 'off'.

الرابط الصالح ليس رابطًا آمنًا

يفحص FILTER_VALIDATE_URL أن النص بشكل رابط، بأي بروتوكول. ويشمل ذلك بروتوكولات لا تريدها أبدًا في href:

يجتاز javascript://comment%0Aalert(1) المرشح FILTER_VALIDATE_URL، ويشغّله المتصفح JavaScript عند النقر على الرابط، لأن %0A ينهي //comment. افحص البروتوكول بـ parse_url() قبل أن تطبع رابط مستخدم في صفحة. ويمكنك أيضًا اشتراط أجزاء بـ FILTER_FLAG_PATH_REQUIRED وFILTER_FLAG_QUERY_REQUIRED.

مرشحات التنقية

تحذف مرشحات التنقية المحارف بدل أن تقول نعم أو لا. وهي مفيدة لتوحيد شكل المُدخلات، لا لجعلها آمنة للطباعة:

انظر إلى السطر الأول: يصبح Order #12-345 (x2) العدد 12-3452، عددًا لم يكن في المُدخل قط، والسطر الثالث عنوان لم يكتبه أحد. إذا نقّيت، فتحقق من النتيجة بعد ذلك. ولكل ما تطبعه في HTML، تكون htmlspecialchars() وقت الإخراج الأداة الصحيحة (ويقوم FILTER_SANITIZE_FULL_SPECIAL_CHARS بالتهريب نفسه). وFILTER_SANITIZE_STRING مهمل منذ PHP 8.1؛ راجع htmlspecialchars لما تستخدمه بدلًا منه.

التحقق من نموذج كامل بـ filter_var_array

تطبّق filter_var_array() مرشحًا واحدًا لكل مفتاح وتعيد مصفوفة فيها كل مفتاح طلبته: القيمة المصفّاة، أو false حين يفشل التحقق، أو null حين يكون المفتاح مفقودًا.

اختفى role: تُسقط المفاتيح التي لم تذكرها، وهذا يمنع الزائر من إضافة role=admin إلى نموذج وحفظها. وcountry قيمتها null لأنها لم تُرسل. وعلى خادم ويب، تفعل filter_input_array(INPUT_POST, $rules) الشيء نفسه بالقراءة مباشرة من الطلب.

الأسئلة الشائعة

كيف أتحقق من عنوان بريد إلكتروني في PHP؟

استخدم filter_var($email, FILTER_VALIDATE_EMAIL)، التي تعيد نص البريد إذا كان صالحًا وfalse إذا لم يكن: if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) { /* invalid */ }. وهي تفحص الشكل فقط؛ ولمعرفة أن العنوان موجود، أرسل بريد تأكيد.

كيف أتحقق من أن نصًا عدد صحيح في PHP؟

تعيد filter_var($s, FILTER_VALIDATE_INT) العدد الصحيح لـ "42" و"-7" و" 42 "، وfalse لـ "4.2" أو "42abc" أو "042". قارن بـ !== false، لأن "0" الصالحة تعيد 0، وهي خاطئة منطقيًا.

لماذا تعيد filter_var القيمة false للصفر؟

لا تفعل: تعيد filter_var('0', FILTER_VALIDATE_INT) العدد الصحيح 0. الخطأ في الفحص، if (filter_var(...))، الذي يعامل 0 مثل false. اكتب if (filter_var($v, FILTER_VALIDATE_INT) !== false).

ما الذي حل محل FILTER_SANITIZE_STRING في PHP 8.1؟

لا شيء مباشرة؛ فقد أُهمل لأن اسمه وعد بأمان لم يقدمه. تحقق من المُدخلات التي تتوقعها، وخزّنها كما هي، وهرّبها حين تطبعها بـ htmlspecialchars(). وإذا احتجت إلى حذف الوسوم، فاستخدم strip_tags().

ما الفرق بين filter_var وfilter_input؟

تصفّي filter_var() أي قيمة تمررها. وتقرأ filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT) مباشرة من الطلب الأصلي، فتعيد null حين يكون المعامل مفقودًا وتتجاهل أي تغييرات أجرتها شيفرتك على $_GET. وكلتاهما تأخذ المرشحات والخيارات نفسها.

رسم توضيحي للغات البرمجة في Coddy

تعلّم البرمجة مع Coddy

ابدأ الآن