今日面试有一道面试题没解出来,郁闷

今天面试有一道面试题没解出来,郁闷啊
假设有"123<em>abc</em>456<em>def</em>789"这么一个字符串,写一个函数,可以传入一个字符串,和一个要截取的长度。返回截取后的结果。

要求:
1 <em>和</em>标记不得计算在长度之内。
2 截取后的字符串,要保留原有<em>标签,不过如果最后有一个标签没有闭合,则去掉其开始标签。

示例:
题中的字符串,要截取长度5,则返回的字符串应该为:123ab,要截取长度8,应返回123<em>abc</em>45。
百度有PHP版本的答案,但看不懂
------解决方案--------------------

        static string GetString(string source, int len)
        {
            string newSource = source.Replace("<em>", "");
            newSource = newSource.Replace("</em>", "");
            if (newSource.Length < len)
            {
                throw new Exception("要截取的长度超出了限制");
            }
            int lastIndex = source.LastIndexOf("</em>");
            string endValue = lastIndex < source.Length - 5 ? source.Substring(lastIndex + 5, source.Length - lastIndex - 5) : "";

            StringBuilder sb = new StringBuilder();
            MatchCollection maths = Regex.Matches(source, "(?<value>[^>]*)(?<em>[<][/]?em[>])");

            for (int i = 0; i < maths.Count; i++)
            {
                string value = maths[i].Groups["value"].Value;
                string em = maths[i].Groups["em"].Value;
                if (value.Length <= len)
                {
                    if (em == "</em>")
                    {
                        sb.AppendFormat("<em>{0}</em>", value);
                    }
                    else
                    {
                        sb.Append(value);
                    }
                    len -= value.Length;
                }
                else
                {
                    sb.Append(value.Substring(0, len));
                    len -= value.Length;
                    break;
                }
            }
            if (len > 0)
            {
                sb.Append(endValue.Substring(0, len));
            }

            return sb.ToString();
        }

坐等更好的办法