Javascript正则表达式查找和替换问题

时间:2015-05-02 07:47:44

标签: javascript html regex

以下HTML没有针对每个匹配的开始</dt>标记的结束<dt>标记。

例如<DT><A HREF="http://go.microsoft.com/fwlink/?LinkId=68924" ADD_DATE="1389093133">MSN Entertainment</A>(此处缺少结束</dt>)。

所以,我决定使用正则表达式添加结束标记。我可以编写模式来查找非封闭的<dt>标签,如

用于查找未关闭的<dt>代码的

regEx模式:

<DT><A HREF=".*</A>

正则表达式替换我使用前一个模式找到的结果</dt>标记

<DT><A HREF=".*</A></DT>

但是我得到的结果是这个字符串<DT><A HREF=".*</A></DT>,而不是只添加结束<dt>标签,我找到了这个模式的所有字符串。

想要在我找到的模式的末尾添加</dt>标记,无论是在IDE中还是通过javascript,我都可以。

HTML文件:

<DL>
    <DT><H3 ADD_DATE="1389093133" LAST_MODIFIED="1423897474">Links for United States</H3>
    <DL>
        <DT><A HREF="http://go.microsoft.com/fwlink/?LinkId=129792" ADD_DATE="1389093133">GobiernoUSA.gov</A>
        <DT><A HREF="http://go.microsoft.com/fwlink/?LinkId=129791" ADD_DATE="1389093133">USA.gov</A>
    </DL>
    <DT><H3 ADD_DATE="1389093133" LAST_MODIFIED="1423897474">MSN Websites</H3>
    <DL><p>
        <DT><A HREF="http://go.microsoft.com/fwlink/?LinkId=55143" ADD_DATE="1389093133">MSN Autos</A>
        <DT><A HREF="http://go.microsoft.com/fwlink/?LinkId=68924" ADD_DATE="1389093133">MSN Entertainment</A>
        <DT><A HREF="http://go.microsoft.com/fwlink/?LinkId=68923" ADD_DATE="1389093133">MSN Money</A>
        <DT><A HREF="http://go.microsoft.com/fwlink/?LinkId=68921" ADD_DATE="1389093133">MSN Sports</A>
        <DT><A HREF="http://go.microsoft.com/fwlink/?LinkId=54729" ADD_DATE="1389093133">MSN</A>
        <DT><A HREF="http://go.microsoft.com/fwlink/?LinkId=68922" ADD_DATE="1389093133">MSNBC News</A>
    </DL>

</DL>

2 个答案:

答案 0 :(得分:2)

正则表达式替换字符串的一个功能是Backreferences,您可以在其中引用源字符串中字符串的一部分。

对于反向引用,您需要使用括号指定搜索字符串的一部分,然后您可以使用\n模式进行反向引用,其中n引用n-th组。

在下面的示例中,我们将所有搜索字符串放在括号中,使其成为我们可以反向引用的组。

(<DT>.*</A>$)

替换字符串:

\1</DT>

答案 1 :(得分:1)

实际上,要查找所有未关闭的FOR EACH jeld-wen.customer : FIND FIRST adm2.order WHERE adm2.order.custnum = jeld-wen.customer.custnum NO-LOCK NO-ERROR. IF AVAIL adm2.order THEN DISP jeld-wen.customer.custnum adm2.order.custnum adm2.order.ordernum. END 代码,您需要检查是否没有结束<DT>代码,并且可以使用否定look-ahead来完成:

</DT>

替换为(<DT[^<]*><A HREF="[\s\S]*?<\/A>)(?!<\/DT>) 。添加$1</DT>选项,我们会确保我们还会捕获i个标记。

<dt>也会捕获换行符。 [\s\S]*?中的[^<]*将确保我们还会使用属性捕获<DT[^<]*>个标记。

请参阅demo

示例代码:

<DT>