跨越多个 XML 标记的字符串匹配索引的正则表达式

Posted

技术标签:

【中文标题】跨越多个 XML 标记的字符串匹配索引的正则表达式【英文标题】:Regex for index of string match spanning across several XML tags 【发布时间】:2014-05-21 14:51:07 【问题描述】:

我正在尝试在 TLF 中插入一个链接。通常你只需简单地使用

var linkElement:LinkElement = textArea.textFlow.interactionManager.applyLink( ... );

问题是,如果我创建一个跨越不同格式文本(粗体、斜体等)的链接,或者天堂禁止跨段落和列出项目,它会完全崩溃和烧毁。链接格式完全丢失,列表结构崩溃。

如果我们要保留所选文本中的格式和结构,那么通过 addChild() 简单地添加 LinkElement 也不起作用。

使用interactionManager.cutTextScrap(...) 为选择撕掉textFlow,使用interactionManager.applyLink(...) 将其包装在LinkElement 中,然后“粘贴”回... 也会造成混乱。

所以我必须创建自己的链接插入例程。

我下定决心要做的是:

1) 将文本流标签转换为字符串

2) 在文本流字符串中查找所选内容的开始和结束索引

3) 在起始索引处插入以下字符串:

</span><a href="[hrefVar]" target="[targetVar]"><span>

4) 在末尾索引处插入以下字符串:

</span></a><span>

5) 将文本流字符串重新转换为 TextArea 的文本流对象

瞧!即时 RTF 链接!

唯一的问题是...我不知道 如何 编写一个正则表达式解析方程,它可以在 XML 标记中找到字符串匹配的开始和结束索引,结果可能分布在其中几个标签。

例如,如果 TextFlow 是(缩写):

<TextFlow><p><span>Lorem Ip</span><span fontWeight="bold">sum do</span><span>
lor sit am</span><span fontStyle="italic">et, consectetur adipiscing elit.
</span></p></TextFlow>

例如,用户选择了“Ipsum dolor sit amet”以转换为链接。我需要在该 RTF 标记中找到“Ipsum dolor sit amet”的第一个和最后一个索引,然后插入上面 3) 和 4) 中指示的字符串,以便最终结果如下所示:

<TextFlow><p><span>Lorem </span><a href="http://www.google.ca" target="_blank">
<span>Ip</span><span fontWeight="bold">sum do</span><span>lor sit am</span>
<span fontStyle="italic">et</span></a><span>, consectetur adipiscing elit.
</span></p></TextFlow>

可能会丢失一些样式格式,但我可以稍后通过文本流格式进行解析。

我需要的是执行步骤 2) 的正则表达式。

我知道正则表达式忽略标签并去除标签之间的文本,以及如何在剥离的文本流文本中找到所选文本的字符串匹配...但不知道如何在原始文本中找到匹配索引(未剥离) 文本流字符串。

有人吗?

【问题讨论】:

【参考方案1】:

恕我直言,更好的方法是遍历字符串而不是尝试使用正则表达式。 这是快速肮脏方式的想法,此代码需要改进,但无论如何它可能会给出指导。 所以主要目标可能只是“丢弃”标签和匹配文本,但计算过程中传递的许多字符。

//This code might need revision for not to get < and > symbols as fake tags starting and finishing points, also reseting searchwhen text not completly done. 

var sourceStr:String = '<TextFlow><p><span>Lorem Ip</span><span fontWeight="bold">sum do</span><span>lor sit am</span><span fontStyle="italic">et, consectetur adipiscing elit.</span></p></TextFlow>';
var searchStr:String = "Lorem Ipsum d";
var indexes:Object = firstLast(sourceStr, searchStr);

trace(indexes.startIndex,indexes.finishIndex);


function firstLast(sourceStr:String, searchStr:String):Object 

    var indexCounter:int = -1;

    var searchFlag:Boolean = true;
    var searchPos:int = 0;

    var searchChar:String;
    var sourceChar:String;

    var startIndex:int;
    var finishIndex:int;

    for (var i:int = 0; i < sourceStr.length; i++ )
    
        indexCounter++;


        sourceChar = sourceStr.substr(i, 1);
        if (sourceChar == "<")
        
            searchFlag = false;

         
        else if (sourceChar == ">")
        
            searchFlag = true;
        

        if (!searchFlag) 
        
            continue;
        

        searchChar = searchStr.substr(searchPos, 1);    
        if (sourceChar == searchChar)
        
            if (searchPos == 0)
            
                startIndex = indexCounter;
            
            if (searchPos == searchStr.length - 1)
            
                finishIndex = indexCounter;
            
            searchPos++;
        


    

    return  startIndex:startIndex, finishIndex:finishIndex ;


【讨论】:

以上是关于跨越多个 XML 标记的字符串匹配索引的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

REGEXP_LIKE 匹配与特定字符串不同的 xml 标记内容

有效 XML 标记名称的 PHP 正则表达式

更改具有与特定正则表达式模式匹配的标记的 xml 树中的值

使用正则表达式查找两个字符串之间的多个匹配项

如何使用正则表达式匹配从 xml 文件中搜索和替换包含占位符标记的文本。 VB.net 或 C#

在javascript中匹配具有多个正则表达式模式的字符串