Regex تحليل الارتباطات التشعبية وأوصاف

StackOverflow https://stackoverflow.com/questions/26323

  •  09-06-2019
  •  | 
  •  

سؤال

C#:ما هو جيد Regex تحليل الارتباطات التشعبية و الوصف ؟

يرجى النظر في حالة عدم الاكتراث, white-space و استخدام علامات الاقتباس المفردة (بدلا من علامات الاقتباس المزدوجة) حول HREF الوسم.

يرجى النظر أيضا الحصول على الارتباطات التشعبية التي العلامات الأخرى داخل <a> الكلمات مثل <b> و <i>. ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

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

المحلول

طالما لا توجد متداخلة به (لا فواصل الأسطر) التالية البديل يعمل بشكل جيد:

<a\s+href=(?:"([^"]+)"|'([^']+)').*?>(.*?)</a>

حالما متداخلة فئة تدخل حيز اللعب ، التعبيرات العادية هي غير صالحة تحليل.ومع ذلك ، لا يزال بإمكانك استخدامها من قبل تطبيق ميزات أكثر تقدما من المفسرين الكبار (اعتمادا على regex آلة).E. g..صافي التعبيرات العادية استخدام كومة ؛ لقد وجدت هذا:

(?:<a.*?href=[""'](?<url>.*?)[""'].*?>)(?<name>(?><a[^<]*>(?<DEPTH>)|</a>(?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:</a>) 

المصدر: http://weblogs.asp.net/scottcate/archive/2004/12/13/281955.aspx

نصائح أخرى

انظر هذا المثال من ستاكوفيرفلوو:التعبير العادي لتحليل الروابط من صفحة الويب ؟

باستخدام HTML Agility Pack يمكنك تحليل html و استخراج تفاصيل باستخدام دلالات HTML بدلا من كسر regex.

لقد وجدت هذا ولكن على ما يبدو هؤلاء الرجال لديه بعض المشاكل مع ذلك.

تحرير: (يعمل!)
لقد فعلت بلدي التجارب وجدت أن يعمل, أنا لا أعرف C# لذلك لا أستطيع أن أعطيك C# الجواب ولكن أنا لا أعرف PHP وهنا مباريات مجموعة عدت من تشغيله على هذا:

<a href="pages/index.php" title="the title">Text</a>

array(3) { [0]=> string(52) "Text" [1]=> string(15) "pages/index.php" [2]=> string(4) "Text" } 

أنا وقد regex الذي يعالج معظم الحالات ، على الرغم من أنني أعتقد أنه لا تطابق HTML داخل تعليق متعدد الأسطر.

إنها مكتوبة باستخدام .صافي الجملة ، ولكن ينبغي أن يكون بسهولة للترجمة.

مجرد الذهاب إلى رمي هذا مقتطف هناك الآن أن لدي عمل..هذا هو أقل جشعا إصدار واحد اقترح في وقت سابق.الأصلي لن تعمل إذا كان الإدخال متعددة الارتباطات التشعبية.هذه التعليمة البرمجية أدناه تسمح لك حلقة من خلال كل الارتباطات التشعبية:

static Regex rHref = new Regex(@"<a.*?href=[""'](?<url>[^""^']+[.]*?)[""'].*?>(?<keywords>[^<]+[.]*?)</a>", RegexOptions.IgnoreCase | RegexOptions.Compiled);
public void ParseHyperlinks(string html)
{
   MatchCollection mcHref = rHref.Matches(html);

   foreach (Match m in mcHref)
      AddKeywordLink(m.Groups["keywords"].Value, m.Groups["url"].Value);
}

هنا هو التعبير العادية التي سوف تتطابق مع العلامات المتوازنة.

(?:""'[""'].*?>)(?(?>(?)|(?<-عمق>)|.)+)(?(عمق)(?!))(?:)

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