«استبدال الكل» في JavaScript: من الحلول القديمة إلى المعيار الحديث
\n\nتخيل موقفًا: أنت تكتب بوت محادثة، وأرسل المستخدم رسالة بها خطأ إملائي «مرحبًا». تحتاج إلى استبدال جميع تكرارات «ًا» بـ «ا». أو أنك تقوم بتحليل ملف CSV وتريد إزالة جميع المسافات الزائدة. يبدو الأمر بسيطًا؟ في JavaScript، حتى وقت قريب، كان هذا بمثابة صداع حقيقي.
\n\nالسؤال «How do I replace all occurrences of a string?» هو أحد أكثر الأسئلة شيوعًا على Stack Overflow. آلاف المطورين تعثروا في هذه المهمة التي تبدو أساسية. لماذا؟ لأن الطريقة القديمة الجيدة replace() تستبدل افتراضيًا أول تطابق فقط. الحيلة؟ يجب استخدام تعبير منتظم مع العلم g. لكن في عام 2025، لدينا حل أكثر أناقة بكثير.
في هذه المقالة، سنستعرض جميع الطرق الحالية لاستبدال جميع تكرارات السلسلة الفرعية في JavaScript: من الكلاسيكيات إلى المعايير الحديثة. ستتعرف على الطريقة التي تختارها لمهام مختلفة ولماذا replaceAll هو صديقك الجديد الأفضل.
لماذا لا تعمل الطريقة القديمة replace() «مباشرة»؟
\n\nلنبدأ بخيبة الأمل التي تصيب كل مبتدئ:
\n\nlet text = "أنا أحب JavaScript، JavaScript رائعة!";\nlet newText = text.replace("JavaScript", "Python");\nconsole.log(newText); \n// الإخراج: "أنا أحب Python، JavaScript رائعة!"\n\n\nأرأيت؟ تم استبدال التكرار الأول فقط. طريقة String.prototype.replace() مصممة بهذا الشكل تاريخيًا. إذا قمت بتمرير سلسلة نصية (وليس تعبيرًا منتظمًا)، فإنها تبحث وتستبدل أول تطابق. بالنسبة للعديد من اللغات (Python، Java)، كان هذا صادمًا. لكن JavaScript عاشت مع هذا القيد لفترة طويلة.
بالمناسبة، إذا كنت تبحث عن إجابة لسؤال «how do I replace all occurrences of a string in JavaScript» بالعربية، فاعلم أنه حتى عام 2021، كانت الطريقة الوحيدة الموثوقة هي استخدام RegExp.
\n\nالطريقة رقم 1: الكلاسيكية — replace() + RegExp (لا تزال صالحة)
\n\nهذه هي طريقة «الجد» التي تعمل في جميع المتصفحات، بما في ذلك Internet Explorer (نعم، لا يزال موجودًا في مكان ما). السر هو العلم g (global).
let text = "القطة أكلت الفأر. القطة سعيدة.";\nlet newText = text.replace(/قطة/g, "كلب");\nconsole.log(newText); \n// "الكلب أكل الفأر. الكلب سعيدة."\n\n\nالإيجابيات:
\n- \n
- يعمل في كل مكان (IE11، الإصدارات القديمة من Node.js) \n
- قوي: يمكن استخدام مجموعات الالتقاط، العلم
i(عدم حساسية حالة الأحرف) \n - سريع جدًا \n
السلبيات:
\n- \n
- يحتاج إلى هروب الأحرف الخاصة (النقطة، النجمة، إلخ) \n
- الكود أقل قابلية للقراءة للمبتدئين \n
- غير مناسب إذا كانت السلسلة المراد استبدالها ديناميكية (تأتي من المستخدم) \n
إذا كنت بحاجة إلى استبدال سلسلة ديناميكية، استخدم منشئ RegExp:
function escapeRegExp(string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nlet userInput = "مرحبا.عالم";\nlet text = "مرحبا.عالم، كيف حالك؟ مرحبا.عالم!";\nlet safePattern = escapeRegExp(userInput);\nlet result = text.replace(new RegExp(safePattern, 'g'), 'وداعا.الكل');\nconsole.log(result);\n// "وداعا.الكل، كيف حالك؟ وداعا.الكل!"\n\n\nدالة escapeRegExp هي طقوس إلزامية إذا كنت تعمل مع إدخال المستخدم. وإلا، سيتم تفسير النقطة في السلسلة على أنها «أي حرف».
الطريقة رقم 2: المعيار الحديث — replaceAll() (ES2021+)
\n\nبدءًا من ES2021 (ECMAScript 2021)، لدينا String.prototype.replaceAll(). هذا هو الجواب على سؤال «how do I replace all occurrences of a string in JavaScript» الذي انتظرناه لسنوات.
let text = "أنا أحب JavaScript، JavaScript رائعة!";\nlet newText = text.replaceAll("JavaScript", "Python");\nconsole.log(newText); \