سؤال

لقد اتخذت URL الليبرالي Regex من جريئة كرة نارية, ، دمجها مع بعض التحسينات العاصفة آلان واخترق طريقي إلى إصلاح بعض الأخطاء مثل الدعم ل IDN Chars داخل الأقواس. هذا ما لدي:

/(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/

ومع ذلك فقد واجهت خطأ أنني لست قادرا على حلها:

'www.dsd(sd)sdsd.com' // can also be the valid 'www.dsd.com/whatever(whatever)'

يتم التعرف على عنوان URL أعلاه www.dsd(sd)sdsd.com' (أو www.dsd.com/whatever(whatever)') بدلا من www.dsd(sd)sdsd.com (أو www.dsd.com/whatever(whatever)). يبدو أن هذا فقط يحدث عندما يحتوي عنوان URL على قوسين، لأن عنوان URL التالي:

'www.sampleurl.com'

يتم التعرف عليه بشكل صحيح www.sampleurl.com.

أظن ال [^[:punct:]\s]|\/ لا يتم تنفيذ جزء من Regex عندما يحتوي عنوان URL على قوسين, ، لقد كنت أحاول لبعض الوقت ولكن لا يمكنني العثور على حل. هل يستطيع أي أحد مساعدتي؟

للسلعة، لقد قمت بإعداد الرابط الثابت بيرمالينك مع Regex وبعض بيانات الاختبار (فشل عنوان URL الأخير).


أعتقد أن Regex's Regex كانت هرع قليلا، على سبيل المثال، لا تتطابق مع URL مثل:

http://en.wikipedia.org/wiki/Something_(Special)_For_You

أنا أعجب أكثر برؤية كل ذلك جروبر و آلان غاب عن هذا الخطأ المطبعي بسيط حقا:

\([\w\d]+\)

لن \(\w+\) كن كافيا :س

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

المحلول

يبدو مثل قام Gruber بتنقيح تعبيره العادي:

\b((?:[a-z][\w-]+:(?:\/{1,3}|[a-z0-9%])|www\d{0,3}[.])(?:[^\s()<>]+|\([^\s()<>]+\))+(?:\([^\s()<>]+\)|[^`!()\[\]{};:'".,<>?«»“”‘’\s]))

يعمل بشكل جيد الآن.

نصائح أخرى

www.dsd (SD) SDSD.com ليس اسم مجال صالح.

إذا كان لديك 'www.dsd.com/whatever(whatever)', ، سيتم الاعتراف به بشكل صحيح. (أو على الأقل في اختباراتي)

 /(?:[\w-]+:\/\/?|www[.])[^\s()<>]+(?:(?:\([^\s()<>]*\)[^\s()<>]*)+|[^[:punct:]\s]|\/)/
  www.                   |               |            |
                          dsd            |            |
                                          (sd)        |
                                                       sdsd.com'

هذه هي الطريقة التي أعتقد أن هذا ينهار ... قليلا من regex أعلاه (sd) يبدأ بجنون مفتوح هرب، ثم مطابقة فئة سحر التحديق sd, ، ثم خجن إغلاق هرب، والشيء التالي هو [^\s()<>]* الذي يطابق sdsd.com'.

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