htmlentities() مقابل htmlspecialchars(): دليل شامل مع أمثلة
\n\nهل تساءلت يومًا لماذا يوجد في PHP دالتان تقومان، على ما يبدو، بنفس الشيء؟ htmlentities() و htmlspecialchars() — هما مثل توأمين متطابقين: متشابهان من الخارج، لكن الشخصيات مختلفة. والاختيار بينهما قد يصبح إما مهارة خارقة لديك، أو مصدرًا للصداع.
إذا سبق لك أن طرحت هذا السؤال على Stack Overflow (وهناك الآلاف مثلك!)، فأنت تعلم أن الإجابة ليست دائمًا واضحة. اليوم سنفهم مرة وإلى الأبد أي دالة تُستخدم لأي غرض، ومتى نستخدم كلًا منهما، وكيف لا نقع في مشاكل الترميز.
\n\nهيا بنا!
\n\nما الذي تفعله هذه الدوال بالضبط؟
\n\nكِلتا الدالتين مصممتان لـ ترميز رموز HTML. ببساطة: هما تحوّلان الرموز الخاصة إلى كيانات HTML الخاصة بها، بحيث يعرضها المتصفح كنص، ولا يفسرها ككود.
\n\nعلى سبيل المثال، الرمز < يتحول إلى <. هذا أمر بالغ الأهمية من أجل:
- \n
- الأمان — الحماية من هجمات XSS (البرمجة النصية عبر المواقع) \n
- العرض الصحيح — حتى لا "يكسر" النص الخاص بك ترميز HTML \n
ولكن هنا يكمن المكمن: htmlspecialchars() تعمل فقط مع أربعة رموز، بينما htmlentities() تعمل مع جميع كيانات HTML المعروفة.
htmlspecialchars(): المدفعية الخفيفة
\n\nالدالة htmlspecialchars() تحول فقط هذه الرموز:
- \n
&(علامة العطف) →&\n "(الاقتباس المزدوج) →"(إذا لم يتم تعيين العلم ENT_NOQUOTES) \n '(الاقتباس المفرد) →'(إذا تم تعيين العلم ENT_QUOTES) \n <(أقل من) →<\n >(أكبر من) →>\n
هذه المجموعة كافية لـ 99% من الحالات. لماذا؟ لأن هذه الرموز فقط لها معنى خاص في ترميز HTML ويمكنها كسر صفحتك.
\n\n<?php\n$user_input = '<script>alert("XSS")</script>';\necho htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');\n// سيطبع: <script>alert("XSS")</script>\n?>\n\nhtmlentities(): الفرسان الثقيلة
\n\nhtmlentities() — هي ذلك الشخص المثالي الذي يحول جميع الرموز التي لها مقابل في HTML إلى كيانات. على سبيل المثال، رموز العملات (€, £, ¥)، العلامات الرياضية (∑, ∞, √) وحتى الأسهم (←, ↑).
<?php\n$text = 'التكلفة: 50€';\necho htmlentities($text, ENT_QUOTES, 'UTF-8');\n// سيطبع: التكلفة: 50€\n?>\n\nيبدو هذا مناسبًا، أليس كذلك؟ لكن هناك فارق بسيط — الأداء. htmlentities() تعمل بشكل أبطأ، لأنها تعالج رموزًا أكثر. وإذا كان موقعك يعالج آلاف الأسطر، يصبح الفرق ملحوظًا.
الفرق الرئيسي: الترميز
\n\nوهنا نصل إلى أهم نقطة. كِلتا الدالتين تقبلان معاملًا ثالثًا — الترميز. وإذا لم تحدده، ستستخدم PHP القيمة من التوجيه default_charset في ملف php.ini (عادةً ما يكون UTF-8).
لكن htmlentities() حساسة بشكل خاص للترميز. إذا حددت ترميزًا خاطئًا، قد تحول الدالة الرموز بشكل غير صحيح. على سبيل المثال، مع ISO-8859-1، قد تُفقد بعض رموز UTF-8.
<?php\n// مثال سيء: لم يتم تحديد الترميز\necho htmlentities('مرحبًا، أيها العالم!'); // قد يُصدر تحذيرًا\n\n// مثال جيد: حدد الترميز دائمًا\necho htmlentities('مرحبًا، أيها العالم!', ENT_QUOTES, 'UTF-8');\n?>\n\nمتى تستخدم ماذا؟
\n\n