查找未被指定html标记包围的未指定html标记的正则表达式

时间:2019-01-29 14:59:18

标签: regex tags

我正在尝试找到一个正则表达式,该正则表达式可以找到以下所有标签:

  1. 不属于允许的标签列表
  2. 没有被特定标签包围

这是我目前拥有的:

(?<!<noparse>)<(?!(\/?(noparse|u))).*?>(?!<\/noparse>)

如果我输入以下内容

<u><b>test2</b></u>
<noparse><u><b>test</b></u></noparse>
<noparse><b>test</b></noparse>

它将匹配

<b> & </b> (correct, not surrounded by <noparse></noparse>, <u></u> is allowed)
<b> & </b> (incorrect, surrounded by <noparse></noparse>)
</b></noparse> (incorrect, surrounded by <noparse></noparse>)

但是,我希望它与之匹配

<b> & </b>
{nothing}
{nothing}

您可以在此处查看: https://regex101.com/r/HO1Bo2/1

我想这样做,以便可以清理字符串。我们的应用程序是在Unity中制作的,并使用TextMeshPro来显示文本。 TMP支持很多标签,所有标签都可以在这里找到:http://digitalnativestudios.com/textmeshpro/docs/rich-text/。我们只希望允许使用其中几个标签,因为用户可能会变得太有创意,并开始混淆行高,偏移量,字体大小等。我们还希望使用该标签,以便用户可以用它包围任何受支持的标签,以使其显示为纯文本。

预先感谢,我敢肯定周围有比我聪明的人!

您, 巴斯

1 个答案:

答案 0 :(得分:0)

最后我走了一条不同的路,因为Regex在这种情况下确实无法解决问题。

  1. 创建一个列表,其中包含在清理过程中不应考虑的所有字符串
  2. 用规范化格式项替换输入字符串中的所有现有格式项,并备份所述列表中的原始格式项。

    <b>test</b> {56} <noparse><b>test</b></noparse> {3}
    becomes
    <b>test</b> {0} <noparse><b>test</b></noparse> {1}
    
  3. 用标准格式项替换所有现有的...块,并将它们添加到同一列表中。

    <b>test</b> {0} <noparse><b>test</b></noparse> {1}
    becomes
    <b>test</b> {0} {2} {1}
    
  4. 使用以下正则表达式检索剩余字符串中所有不受支持的标签并清理:

    <(?!(\/?(u|i))).*?>
    

    在这种情况下,以下标记是受支持的标记,所有其他标记将由正则表达式找到:

    <u></u><i></i>
    

    使用noparse标签包围所有不受支持的标签会导致以下字符串:

    <b>test</b> {0} {2} {1}
    becomes
    <noparse><b></noparse>test<noparse></b></noparse> {0} {2} {1}
    
  5. 现在我们可以再次用其原始文本替换所有格式项

    string sanitizedString = string.Format(sanitizedStringBuilder.ToString(), replacedStrings.ToArray());  
    

    结果:

    <noparse><b></noparse>test<noparse></b></noparse> {56} <noparse><b>test</b></noparse> {3}
    

似乎工作得非常好,尽管有很多步骤,但我对此解决方案感到非常满意。