我需要编写一个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
答案 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);
}
}