обрезать строку после номера - PullRequest
1 голос
/ 10 января 2011

Мне нужно настроить свой код так, чтобы он урезал URL после числа. например, я хочу, чтобы все после удаления List = 36. буквы и специальные символы являются единственными потенциальными символами, которые могут следовать за номером списка. так что я просто хочу обрезать URL, когда он читает букву или специальный символ после номера списка. Благодарю.

примеры текущих URL, которые регистрируются при отправке

https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?List=36caab7e%2D2234%2D4981%2D8225%%2Easpx

https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?List=36,http://portal.test/testabc/Lists/TEST/AllItems.aspx

URL, который я хочу получить при отправке:

https://portal.test.com/sites/test/testabc/Lists/RFC/DispFormSort.aspx?List=36

мой текущий код для метода, который захватывает URL:

    public static string GenerateShortUrl(SPList list, int itemId)
    {
        try
        {
            var item = list.GetItemById(itemId);
            var itemUrl = string.Empty;

            if (item.File == null)
                itemUrl = SPContext.Current.Web.Url + "/" + list.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url + "?ID=" + item.ID;
            else
                itemUrl = SPContext.Current.Web.Url + "/" + item.Url;

            var generatedShortedUrl = GetShortUrl(itemUrl);

            return generatedShortedUrl;
        }
        catch (Exception ex)
        {
            Utilities.WriteError(ex.ToString());

            throw new SPException("An error occurred while attempting to shorten a URL.", ex);
        }
    }

     private static string GetShortUrl(string itemUrl)
        {
            var shortId = Utilities.GenerateHash(itemUrl);
            var shortenerUrl = string.Empty;

            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                    var farm = SPAdministrationWebApplication.Local;
                    using (var site = farm.Sites[0])
                    {
                        using (var web = site.RootWeb)
                        {
                            if (!web.Properties.ContainsKey("LiebrandUrlShortener"))
                                throw new SPException(SPUtility.GetLocalizedString("$Resources:liebrandurlshortener,CannotFindUrl", "liebrandurlshortener", web.Language));

                            var urlList = web.Lists[SPUtility.GetLocalizedString("$Resources:liebrandurlshortener,StorageName", "liebrandurlshortener", web.Language)];

                            var query = new SPQuery();
                            query.Query = "<Where><Eq><FieldRef Name='Title'/><Value Type='Text'>" + shortId + "</Value></Eq></Where>";

                            var items = urlList.GetItems(query);
                            if (items.Count == 0)
                            {

                                var urlListItem = urlList.Items.Add();
                                urlListItem["Title"] = shortId;
                                urlListItem["RedirectTo"] = itemUrl;

                                web.AllowUnsafeUpdates = true;
                                urlListItem.Update();
                                web.AllowUnsafeUpdates = false;

                            }

                            shortenerUrl = web.Properties["LiebrandUrlShortener"];
                        }
                    }
            });

            return shortenerUrl + "/" + shortId;
        }

        public static string GenerateShortUrl(string longUrl)
        {
            return GetShortUrl(longUrl);
        }



    }
}

Ответы [ 5 ]

9 голосов
/ 10 января 2011

Вы можете использовать Regex , чтобы захватить все до тех пор, пока? List = [число].

Вы можете использовать это Regex:

Regex.Match(str, @"^.*\?List=\d+").Value
0 голосов
/ 23 января 2011

Я предпочитаю LINQ:

string url = @"https://portal.test/...";
string flag = "List=";
int flagIndex = url.IndexOf(flag) + flag.Length;
string shortUrl = new string(url.TakeWhile((ch, index) => 
                          index < flagIndex || char.IsDigit(ch)).ToArray());
0 голосов
/ 18 января 2011

Вы можете использовать регулярные выражения для этого. Поскольку вы сказали, что буквы и специальные символы являются единственными потенциальными символами, которые могут следовать за номером списка, мое регулярное выражение выбирает все до? List = [число] и любые буквы и специальные символы, пока не найдет цифру или символ, которые не следует выбирать до

Regex.Match(url, @"^.*\?List=\d+[A-Za-z._%+-]*+").Value

Попробуйте проверить это здесь: http://www.regexplanet.com/simple/index.html

0 голосов
/ 18 января 2011

Иногда трудный путь - самый простой.Ответы на основе регулярных выражений будут возвращать неправильные значения для URL, которые не в ожидаемом формате.

    static void Main(string[] args)
    {
        string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?List=36caab7e%2D2234%2D4981%2D8225%%2Easpx";

        //TEST CASES:

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?SomeParam=36caab7e%2D2234%2D4981%2D8225%%2Easpx";
        //should return null

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?SomeParam=nih543&List=786yui";
        //should return https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?786

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx?";
        //should return null

        //string inputString = @"https://portal.test/sites/test/testabc/Lists/TEST/DispFormSort.aspx";
        //should return null

        string result = GetShortenedListURL(inputString);

        Console.WriteLine(result);
        Console.ReadKey();
    }

    private static string GetShortenedListURL(string InputString)
    {
        //Split URL into address and parameter tokens
        var tokens = InputString.Split('?');
        if (tokens.Length > 1)
        {
            var urlParams = tokens[1].Split('&');
            const string listStarter = "LIST=";

            //Loop through parameters looking for one that begins with List
            foreach (var param in urlParams)
            {
                if (param.ToUpperInvariant().StartsWith(listStarter))
                {
                    //Found the right parameter, now look for a contiguous string of numbers
                    for (int numCounter = listStarter.Length; numCounter < param.Length; numCounter++)
                    {
                        if (!Char.IsDigit(param[numCounter]))
                        {
                            if (numCounter > listStarter.Length)
                            {
                                return tokens[0] + "?" + param.Substring(listStarter.Length, numCounter - listStarter.Length);
                            }
                        }
                    }

                }
            }

        }

        return null;
    }
0 голосов
/ 10 января 2011
 string url = "https://portal.test.com/sites/test/testabc/Lists/RFC/DispFormSort.aspx?List=36caab7e%2D2234%2D4981%2D8225%%2E.aspx";

 Regex regex = new Regex(@"^.*List=\d+");
 Match match = regex.Match(url);

 if (match.Success)
 {
    Console.WriteLine(match.Value);
 }

РЕДАКТИРОВАТЬ: Измененный код, я думал, что он должен был извлечь только число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...