سؤال

خلفية سريعة: لدي سلسلة تحتوي على مراجع إلى صفحات أخرى. ترتبط الصفحات باستخدام التنسيق: "# 12". التجزئة تليها معرف الصفحة.

قل لدي السلسلة التالية:

str = 'This string links to the pages #12 and #125'

أنا أعرف بالفعل معرفات الصفحات التي تحتاج إلى ربط:

page_ids = str.scan(/#(\d*)/).flatten
=> [12, 125]

كيف يمكنني حلقة من خلال معرفات الصفحة وربط # 12 و # 125 على صفحاتهم؟ المشكلة التي أجريها هي إذا قمت بذلك التالية (في القضبان):

page_ids.each do |id|
  str = str.gsub(/##{id}/, link_to("##{id}", page_path(id))
end

هذا يعمل بشكل جيد ل # 12 ولكنه يربط الجزء "12" من # 125 إلى الصفحة مع معرف 12.

أي مساعدة سيكون رائعا.

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

المحلول

إذا كانت الفهارس الخاصة بك تنتهي دائما في حدود Word، فيمكنك مطابقة ذلك:

page_ids.each do |id|
  str = str.gsub(/##{id}\b/, link_to("##{id}", page_path(id))
end

تحتاج فقط إلى إضافة رمز حدود كلمة \b على نمط البحث، ليس من الضروري لنمط البديل.

نصائح أخرى

بدلا من استخراج المعرفات أولا ثم استبدالها، يمكنك ببساطة العثور عليها واستبدالها في واحدة تذهب:

str = str.gsub(/#(\d*)/) { link_to("##{$1}", page_path($1)) }

حتى إذا لم تتمكن من ترك خطوة الاستخراج لأنك تحتاج إلى معرفات مكان آخر أيضا، فينبغي أن يكون هذا أسرع بكثير، لأنه لا يتعين عليه الذهاب عبر السلسلة بأكملها لكل معرف.

ملاحظة: إذا str لا يشار إليها من أي مكان آخر، يمكنك استخدام str.gsub! بدلا من str = str.gsub

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