正则表达式在<a></a> </span>之前添加<span>标记

时间:2011-03-17 21:41:22

标签: java regex html

我需要编写一个util来添加标签

Test string points to <p><a href="http://www.acdevents.com/au2005/">Acd Event</a> with an image <a href="http://www.acdevents.com"><img src="image.jpg"></a>

这需要更改为

Test string points to <p><span class="test_class"><a href="http://www.acdevents.com/au2005/">Acd Event</a></span> with an image <a href="http://www.acdevents.com"><img src="image.jpg"></a>

正如您所看到的,只有在网址指向物理页面而不是图像的情况下才需要添加标记。

我打算用正则表达式实现这一目标,但到目前为止没有运气。

任何关于此的指针都将被高度指定。

-Thanks

2 个答案:

答案 0 :(得分:2)

将我的评论转化为答案,正则表达式不适合这项工作。我建议使用像John Cowan这样的解析器'TagSoup'来编写一些代码来过滤HTML。如果您更喜欢类似于SAX的DOM,那就是NekoHTML

如果您完全确定要沿着正则表达式路线前进,并且您正在使用PCRE或支持前瞻的其他正则表达式引擎,则可以使用断言,因此此正则表达式可以为您完成工作:< / p>

s.replaceAll("<a[^>]*?>(?!<img.*)(.+?)</a>", "<span class=\"test_class\">$0</span>");

我没有测试过,但要点是正确的。重要的是(?!<img.*),它声称您不希望匹配<img后跟该位置的任何内容。这可能对你有用,但我仍然认为一点点解析是最佳途径。

答案 1 :(得分:1)

如果页面上有像jQuery这样的库,你可以用这样的东西来做:

$("a").wrap("<span class='test_class' />");

或者,如果您需要先对URL进行检查:

$("a").each(function(){ 
    var element = $(this);
    var href = element.attr("href");
    if (href.indexOf("http://someUrl") > -1){ 
        element..wrap("<span class='test_class' />");
    }
});

如果你没有jQuery,你可以这样做:

var elements = document.body.getElementsByTagName("a");
for (var i = 0; i < elements.length; i++) {
    var element = elements[i];
    var clone = element.cloneNode(true);
    var parent = element.parentNode;

    var span = document.createElement("span");
    span.setAttribute("class", "test_class");
    span.appendChild(clone);
    parent.replaceChild(span, element); 
}

您可以使用Document界面在Java中执行非常类似的操作:

DocumentBuilder builder = DocumentBuilderFactory.newDocumentBuilder();
Document doc = builder.parse(yourJavaHtmlString);
NodeList nodes = doc.getElementsByTagName("a");
for (int i = 0; i < nodes.getLength(); i++) {
    Element element = (Element) nodes.item(i);
    String href = element.getAttribute("href");
    if (!href.equals("http://www.acdevents.com")) {
        Element clone = element.cloneNode(true);
        Element parent = element.getParentNode();

        Element span = doc.createElement("span");
        span.setAttribute("class", "test_class");
        span.appendChild(clone);
        parent.replaceChild(span, element);
    }
}