JSON Formatter
Pretty-print, validate and minify JSON with precise error positions.
المطورون
اختبر الأنماط مباشرة مع تمييز المطابقات وجدول المجموعات.
هذه أكثر مفاجأة تواجه من يكتب تعبيرًا نمطيًا لنص عربي، وهي صامتة تمامًا: النمط لا يخطئ، بل لا يطابق شيئًا.
الفئة \w تعني في JavaScript افتراضيًا [A-Za-z0-9_] فقط. فالنمط ^\w+$ يطابق "Ahmed" ولا يطابق «أحمد» — ولا أي كلمة عربية على الإطلاق. والفئة [a-z] كذلك.
وهذا أشدّ أثرًا في العربية منه في لغات أخرى تكتب بالحروف اللاتينية: هناك يطابق النمط أغلب الكلمات ويخفق في المشكولة منها فقط، وهنا يخفق في كل شيء.
والحل هو راية u مع فئات خصائص Unicode: \p{L} لأي حرف في أي كتابة، و\p{Arabic} للحروف العربية تحديدًا.
فالنمط /^\p{L}+$/u يطابق «أحمد» و«Müller» و«田中» جميعًا. وهو الخيار الصحيح لكل ما يتعامل مع أسماء حقيقية.
العربية تضيف مشكلتين لا وجود لهما في النص اللاتيني، وكلتاهما تكسر المطابقة دون أثر مرئي.
الأولى التشكيل. الحركات نقاط ترميز مستقلة تقع ضمن الفئة \p{Mn} أي العلامات غير المتباعدة. فالنمط الذي يطابق «كتب» لا يطابق «كَتَبَ»، لأن بين الحروف محارف إضافية. ولمطابقة النصين معًا إما أن تُزال الحركات قبل المطابقة، أو يُسمح بها في النمط: ك\p{Mn}*ت\p{Mn}*ب — وهو حل صحيح وبشع، والأول أفضل.
والثانية علامتا الاتجاه U+200F وU+200E. يضيفهما المحرّر تلقائيًا عند خلط العربية باللاتينية، وتنتقلان مع النسخ. فسلسلة تبدو مطابقة للنمط لا تطابقه، دون أي فرق مرئي.
والعادة العملية: نظّف النص قبل تطبيق التعبير النمطي عليه. أداة تنظيف النص تزيل التشكيل والمحارف غير المرئية وتوحّد صور الألف والياء — وهذه الخطوات الثلاث تحلّ أغلب حالات الإخفاق.
الرايات تغيّر السلوك جذريًا، وكثيرًا ما تُخلط.
| الراية | الأثر |
|---|---|
| g | يجد كل المطابقات لا الأولى فقط |
| i | يتجاهل حالة الأحرف — لا أثر له على العربية |
| m | ^ و$ تعملان على كل سطر بدل النص كاملًا |
| s | النقطة تطابق فواصل الأسطر أيضًا |
| u | وضع Unicode، ولا غنى عنه لـ \p{...} وللعربية |
| y | يبحث من الموضع الحالي بالضبط |
الراية i لا تفعل شيئًا مع النص العربي، لأن الأبجدية أحادية الحالة. وهذا لا يعني تركها في الأنماط المختلطة — فهي ما زالت تعمل على الجزء اللاتيني منها.
وسوء الفهم الشائع بين m وs: الأولى تغيّر موضع عمل ^ و$ فقط، ولا تغيّر ما تطابقه النقطة. ومن أراد المطابقة عبر الأسطر يحتاج s.
المحدِّدات جشعة افتراضيًا: .* يأخذ أكبر قدر ممكن ثم يتراجع بالقدر اللازم. وبإضافة علامة استفهام يصبح كسولًا فيأخذ أقل قدر ممكن.
وفي النص <b>غامق</b> و<b>ثخين</b> يطابق <b>.*</b> كل شيء من أول وسم إلى آخره. أما <b>.*?</b> فيطابق المقطعين منفصلين.
والخطر في المحدِّدات المتداخلة مثل (a+)+b: مع مدخل غير مطابق يجرّب المحرّك عددًا أُسّيًا من التقسيمات، فيستغرق ذلك دقائق مع ثلاثين محرفًا ويجمّد الصفحة. ومن يبني أنماطًا من مدخلات المستخدمين يفتح بذلك ثغرة حقيقية.
لأن \w و[a-z] تغطّيان ASCII فقط. استخدم الراية u مع \p{L} أو \p{Arabic}.
الأفضل إزالة التشكيل قبل المطابقة. البديل السماح بـ \p{Mn}* بين الحروف، وهو صحيح وصعب القراءة.
لا. الأبجدية العربية أحادية الحالة. لكنها تبقى مفيدة في الأنماط المختلطة.
m تجعل ^ و$ تعملان على كل سطر. وs تجعل النقطة تطابق فواصل الأسطر. أمران مختلفان.
غالبًا تراجع كارثي بسبب محدِّدات متداخلة مثل (a+)+. بسّط النمط.
لا. كل شيء يجري داخل هذه الصفحة.