سؤال

أنا أبحث عن تعبير عادي .NET لاستخراج جميع عناوين URL من صفحة ويب ولكن لم أجد تعبيرًا شاملاً بما يكفي لتغطية جميع الطرق المختلفة التي يمكنك من خلالها تحديد رابط.

وسؤال جانبي:

هل هناك ريكس واحد للحكم عليهم جميعا؟أم أنني أفضل حالًا باستخدام سلسلة من التعبيرات العادية الأقل تعقيدًا واستخدام تمريرات متعددة مقابل HTML الخام؟(السرعة مقابل.قابلية الصيانة)

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

المحلول

((mailto\:|(news|(ht|f)tp(s?))\://){1}\S+)

أخذت هذا من regexlib.com

[ملحوظة المحرر:ليس لدى {1} وظيفة حقيقية في هذا التعبير العادي؛ انظر هذا المنصب]

نصائح أخرى

من مكتبة RegexBuddy:

عنوان URL:البحث في النص الكامل

تتأكد فئة الأحرف النهائية من أنه إذا كان عنوان URL جزءًا من بعض النصوص، فلا يتم تفسير علامات الترقيم مثل الفاصلة أو النقطة بعد عنوان URL كجزء من عنوان URL.

\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|!:,.;]*[-A-Z0-9+&@#/%=~_|]

مع أتش تي أم أل أجيليتي حزمة, ، يمكنك استخدام:

HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a@href")
{
Response.Write(link["href"].Value);
}
doc.Save("file.htm");

انظر إلى مواصفات URI.يمكن أن يساعدك ذلك كثيرًا.وفيما يتعلق بالأداء، يمكنك تقريبًا استخراج جميع روابط HTTP الموجودة في صفحة ويب متواضعة.عندما أقول متواضع فأنا بالتأكيد لا أقصد صفحة واحدة تشمل جميع أدلة HTML مثل دليل ELisp.الأداء أيضًا موضوع حساس.نصيحتي هي قياس أدائك ثم تحديد ما إذا كنت ستقوم باستخراج جميع الروابط باستخدام تعبير عادي واحد أو باستخدام تعبيرات تعبير عادي متعددة أبسط.

http://gbiv.com/protocols/uri/rfc/rfc3986.html

جميع HTTP وMAILTO

(["'])(mailto:|http:).*?\1

جميع الروابط، بما في ذلك الروابط النسبية، التي يتم استدعاؤها بواسطة href أو src.

#Matches things in single or double quotes, but not the quotes themselves
(?<=(["']))((?<=href=['"])|(?<=src=['"])).*?(?=\1)

#Maches thing in either double or single quotes, including the quotes.
(["'])((?<=href=")|(?<=src=")).*?\1

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

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

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
....*SNIP*....
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

(من المفترض أن يتطابق هذا مع عناوين البريد الإلكتروني)

يحرر:لا أستطيع حتى أن أضعه في مشاركة واحدة فهو سيء للغاية....

سيؤدي هذا إلى التقاط عناوين URL من جميع العلامات طالما استخدم مؤلف HTML علامات الاقتباس:

<a[^>]+href="([^"]+)"[^>]*>

لقد قدمت مثالا هنا.

عناوين URL؟كما هو الحال في الصور/البرامج النصية/CSS/إلخ؟

%href="(.["]*)"%

وفق http://tools.ietf.org/html/rfc3986

استخراج عنوان url من أي نص (وليس فقط HTML)

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top