【问题标题】:Regex to add <span> tag before <a>正则表达式在 <a> 之前添加 <span> 标签
【发布时间】:2011-03-17 21:41:22
【问题描述】:

我需要编写一个工具来在任何之前添加一个标签

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>

如您所见,仅当 url 指向物理页面而不是图像时才需要添加标签。

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

对此的任何指针都会受到高度重视。

-谢谢

【问题讨论】:

  • 尝试用正则表达式来做这件事听起来很痛苦。也许你可以使用XSLT?您是在使用格式良好的 HTML 文档,还是嵌入在纯文本中的标签(如示例中)?
  • 正则表达式 + html = 痛苦。改用 DOM:stackoverflow.com/questions/3524431/…
  • 我感到使用正则表达式的痛苦,但没有其他出路。出于某种奇怪的原因,我从不同的服务接收 html bosy 文本作为字符串。我需要做一些格式化和预处理,其中一部分是我提出的问题。没有 XSLT 的范围。
  • 我同意 Brandon 的观点:正则表达式不是适合这项工作的工具。我建议使用诸如 John Cowan 的“TagSoup”之类的解析器来编写一些代码来过滤 HTML。如果您更喜欢类似 DOM 的东西而不是类似 SAX 的东西,那就是 NekoHTML。

标签: java regex html


【解决方案1】:

将我的评论变成答案,正则表达式不是适合这项工作的工具。我建议使用解析器,例如 John Cowan 的 'TagSoup' 来编写一些代码来过滤 HTML。如果您更喜欢类似 DOM 而不是类似 SAX 的东西,可以使用 NekoHTML

如果您绝对确定要走正则表达式路线并且您正在使用 PCRE 或其他支持前瞻的正则表达式引擎,您可以使用断言,因此这个正则表达式可能会为您完成这项工作:

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

我还没有测试过,但要点是正确的。重要的是(?!&lt;img.*),它断言您不想匹配&lt;img,然后是该位置的任何内容。这可能对你有用,但我仍然认为一点解析是最好的方法。

【讨论】:

  • 感谢 Keith 抽出宝贵时间。您的解决方案就像一个魅力。我同意你的观点,解析器是最好的解决方案。话虽如此,我收到的这个字符串没有任何 html 或正文标记,尽管它应该代表正文内容。它也不符合标准。我认为,大多数解析器在解析期间都会失败。最重要的是,它是一个相当小的字符串,带有一些 标签,这提示了我采取正则表达式路线。非常感谢您的帮助,不胜感激。
【解决方案2】:

如果你在页面上有一个像 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);
    }
}

【讨论】:

  • OP 确实说“java”,所以我认为包装应该在服务器端完成,这排除了 javascript。
  • 感谢 Adam .. 不幸的是,这需要在 java 代码中发生。
  • 抱歉,错过了你想要的 Java 版本
  • 我尝试了以下正则表达式,它适用于添加 ,但我无法过滤图像 href。这是添加 所有所有 标记。 testStr.replaceAll("]*>(.+?)\\s*>","$0");
  • 我添加了如何使用 Java 中的 Document 接口在 Java 中完成同样的事情。
猜你喜欢
  • 2014-11-23
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多