找到&使用C#替换字符串中的多个Instagram URL

时间:2015-01-29 07:12:17

标签: c# regex parsing

我想查找字符串中的所有instagram网址,并将其替换为嵌入网址。

但是我热衷于表现,因为这可能是5到20个帖子,每个最多6000个字符,其中有不知名的Instagram网址需要转换。

Url示例(可能是每个字符串中的任何一个,因此需要匹配所有

http://instagram.com/p/xPnQ1ZIY2W/?modal=true
http://instagram.com/p/xPnQ1ZIY2W/
http://instagr.am/p/xPnQ1ZIY2W/

这就是我需要用(嵌入版本)替换它们

<img src="http://instagram.com/p/xPnQ1ZIY2W/media/?size=l" class="instagramimage" />

我在考虑去正则表达式?但这是最快,最高效的方式吗?

非常感谢任何例子。

2 个答案:

答案 0 :(得分:0)

类似的东西:

Regex reg = new Regex(@"http://instagr\.?am(?:\.com)?/\S*");

编辑正则表达式。但是我会将它与字符串阅读器结合起来并逐行进行。然后将字符串(已修改或未修改)放入stringbuilder:

string original = @"someotherText http://instagram.com/p/xPnQ1ZIY2W/?modal=true some other text
some other text http://instagram.com/p/xPnQ1ZIY2W/ some other text
some other text http://instagr.am/p/xPnQ1ZIY2W/ some other text";

StringBuilder result = new StringBuilder();

using (StringReader reader = new StringReader(original))
{
    while (reader.Peek() > 0)
    {
        string line = reader.ReadLine();
        if (reg.IsMatch(line))
        {
            string url = reg.Match(line).ToString();
            result.AppendLine(reg.Replace(line,string.Format("<img src=\"{0}\" class=\"instagramimage\" />",url)));
        }
        else
        {
            result.AppendLine(line);
        }
   }
}

Console.WriteLine(result.ToString());

你的意思是这样吗?

class Program
{
    private static Regex reg = new Regex(@"http://instagr\.?am(?:\.com)?/\S*", RegexOptions.Compiled);
    private static Regex idRegex = new Regex(@"(?<=p/).*?(?=/)",RegexOptions.Compiled);

    static void Main(string[] args)
    {
        string original = @"someotherText  http://instagram.com/p/xPnQ1ZIY2W/?modal=true some other text
some other text http://instagram.com/p/xPnQ1ZIY2W/ some other text
some other text http://instagr.am/p/xPnQ1ZIY2W/ some other text";

        StringBuilder result = new StringBuilder();

        using (StringReader reader = new StringReader(original))
        {
            while (reader.Peek() > 0)
            {
                string line = reader.ReadLine();
                if (reg.IsMatch(line))
                {
                    string url = reg.Match(line).ToString();
                    result.AppendLine(reg.Replace(line, string.Format("<img src=\"http://instagram.com/p/{0}/media/?size=1\" class=\"instagramimage\" />", idRegex.Match(url).ToString())));
                }
                else
                {
                    result.AppendLine(line);
                }

            }
        }

        Console.WriteLine(result.ToString());



    }
}

答案 1 :(得分:0)

精心设计和编译的正则表达式很难被​​击败,特别是因为你正在进行替换,而不仅仅是搜索,但你应该测试以确定。

如果 Instagram的URL只是在HTML属性中的,这是我第一次尝试寻找的模式:

(?<=")(https?://instagr[^">]+)

(我还添加了对https的检查,你没有提及,但我相信得到了Instagram的支持。)

理论上可能会出现一些误报,但它的表现要好于迂回地匹配Instagram URL的每个法律变体。 (“&gt;”检查是为了防止HTML由于某种原因缺少结束引用。)