سؤال

أنا جديد تمامًا على التعبيرات العادية.لديّ مطلب لاستبدال المسافات في جزء من نص متعدد الأسطر.قواعد الاستبدال هي كما يلي:

  • استبدل كافة المسافات في بداية السطر بمسافة غير منقسمة ( ).
  • استبدل أي مثيل للمسافات المتكررة (أكثر من مسافة واحدة معًا) بنفس عدد المسافات غير المنفصلة.
  • تظل المسافات المفردة التي ليست في بداية السطر كما هي.

لقد استخدمت مدرب ريجكس لبناء نمط المطابقة:

/( ){2,}|^( )/

لنفترض أن لدي نص الإدخال هذا:

asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345

باستخدام وظيفة استبدال التعبير العادي PHP (مثل preg_replace())، أريد الحصول على هذا الإخراج:

asdasd asdasd  asdas1
 asda234 4545    54
  34545 345  34534
34 345

أنا سعيد بإجراء عمليات استبدال نصية بسيطة باستخدام التعبيرات العادية، ولكن أواجه مشكلة في معرفة كيفية الاستبدال عدة مرات داخل المباراة من أجل الحصول على النتيجة التي أرغب فيها.

هل كانت مفيدة؟

المحلول

أعتقد أنه سيكون من الأسهل العثور على كل مساحة واستبدالها.للقيام بذلك، استخدم مجموعات "النظر إلى الأمام" و"النظر إلى الخلف".

أو ابحث عن مساحة (\x20) التي إما أن يسبقها أو يتبعها أي مسافة بيضاء واحدة (\s);ولكن فقط استبدل المساحة.

$str = "asdasd asdasd  asdas1\n asda234 4545    54\n  34545 345  34534\n34 345\n";

print preg_replace("/(?<=\s)\x20|\x20(?=\s)/", "&#160;", $str);

(اخترت رقم 160 نظرًا لأن تخفيض السعر يوزع nbsp.)

النتائج في:

asdasd asdasd&#160;&#160;asdas1
&#160;asda234 4545&#160;&#160;&#160;&#160;54
&#160;&#160;34545 345&#160;&#160;34534
34 345

لمزيد من المعلومات، تحقق من PCRE و بيرل.


الرد على التعليقات

@سبروجز:في البداية، اعتقدت نفس الشيء.لكن المثال يوضح أ "\n " => "\n&nbsp;" بين السطر الأول والثاني.

نصائح أخرى

يمكنك استخدام لغة PHP /e المعدل ل ينفذ بعض التعليمات البرمجية في الاستبدال، مثل هذا:

$str = preg_replace('/( {2,}|^ )/em', 'str_repeat("&nbsp;", strlen("\1"))', $str);

لقد قمت بتغيير التعبير العادي لالتقاط المسافات.ال /m المعدل يضعه في وضع متعدد الخطوط، لذلك ^ يطابق بداية أي سطر.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top