أسهل طريقة لتحويل عنوان URL إلى ارتباط تشعبي في سلسلة C#؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

أنا أستهلك واجهة برمجة تطبيقات Twitter وأريد تحويل جميع عناوين URL إلى ارتباطات تشعبية.

ما هي الطريقة الأكثر فعالية التي توصلت إليها للقيام بذلك؟

من

string myString = "This is my tweet check it out http://tinyurl.com/blah";

ل

This is my tweet check it out <a href="http://tinyurl.com/blah">http://tinyurl.com/>blah</a>
هل كانت مفيدة؟

المحلول

ربما تكون التعبيرات العادية هي صديقك لهذا النوع من المهام:

Regex r = new Regex(@"(https?://[^\s]+)");
myString = r.Replace(myString, "<a href=\"$1\">$1</a>");

قد يحتاج التعبير العادي لعناوين URL المطابقة إلى القليل من العمل.

نصائح أخرى

فعلت هذا الشيء نفسه بالضبط مع jquery يستهلك واجهة برمجة تطبيقات JSON هنا هي وظيفة الرابط:

String.prototype.linkify = function() {
    return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
        return m.link(m);
    });
 };

هذه في الواقع مشكلة قبيحة.يمكن أن تحتوي عناوين URL على علامات الترقيم (وتنتهي بها)، لذلك قد يكون من الصعب تحديد المكان الذي ينتهي فيه عنوان URL فعليًا، عندما يكون مضمنًا في نص عادي.على سبيل المثال:

http://example.com/.

هو عنوان URL صالح، ولكنه يمكن أن يكون بسهولة نهاية الجملة:

I buy all my witty T-shirts from http://example.com/.

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

نعم، التعبير العادي هو صديقك هنا، ولكن إنشاء التعبير العادي المناسب هو الجزء الصعب.

تحقق من هذا أيضًا: توسيع عناوين URL باستخدام Regex في .NET.

يمكنك إضافة المزيد من التحكم في هذا باستخدام وظيفة مندوب MatchEvaluator مع التعبير العادي:لنفترض أن لدي هذه السلسلة:

find more on http://www.stackoverflow.com 

الآن جرب هذا الرمز

private void ModifyString()
{
    string input = "find more on http://www.authorcode.com ";
                Regex regx = new Regex(@"\b((http|https|ftp|mailto)://)?(www.)+[\w-]+(/[\w- ./?%&=]*)?");
                string result = regx.Replace(input, new MatchEvaluator(ReplaceURl));
}

static string ReplaceURl(Match m)
{
    string x = m.ToString();
    x = "< a href=\"" + x + "\">" + x + "</a>";
    return x;
}

/ يهتف للذئاب الحمراء

من:this.replace(/[A-Za-z]+://[A-Za-z0-9-]+.[A-Za-z0-9-:%&\?/.=]+/, الوظيفة(م){...

يرى:/[A-Za-z]+://[A-Za-z0-9-]+.[A-Za-z0-9-:%&\?/.=]+/

يوجد رمز للعناوين "anyprotocol"://"anysubdomain/domain"."anydomainextension and Address"،

وهو مثال مثالي للاستخدامات الأخرى لمعالجة السلسلة.يمكنك التقطيع والتقطيع حسب الرغبة باستخدام .replace وإدراج "a href" المناسب عند الحاجة.

لقد استخدمت jQuery لتغيير سمات هذه الروابط إلى "target=_blank" بسهولة في منطق تحميل المحتوى الخاص بي على الرغم من أن طريقة .link لا تسمح لك بتخصيصها.

أنا شخصياً أحب التعامل مع طريقة مخصصة لكائن السلسلة لتصفية السلسلة بسرعة (إعلان String.prototype.linkify)، لكنني لست متأكدًا من كيفية تنفيذ ذلك في بيئة واسعة النطاق حيث يمكنك يجب عليك تنظيم أكثر من 10 وظائف تشبه Linkify مخصصة.أعتقد أنه سيتعين عليك بالتأكيد القيام بشيء آخر باستخدام بنية التعليمات البرمجية الخاصة بك في تلك المرحلة.

ربما يتعثر طبيب بيطري هنا وينيرنا.

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