Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式添加<;span>;标记前<;a>;_Java_Regex_Html - Fatal编程技术网

Java 正则表达式添加<;span>;标记前<;a>;

Java 正则表达式添加<;span>;标记前<;a>;,java,regex,html,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

我需要编写一个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>
测试字符串指向带有图像的
正如您所见,只有当url指向物理页面时,才需要添加标记,而如果是图像,则不需要添加标记

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

任何关于这一点的指针都将受到高度重视


-谢谢

如果您在页面上有一个类似jQuery的库,您可以通过以下方式完成:

$("a").wrap("<span class='test_class' />");
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); 
}
$(“a”).wrap(“”);
或者,如果您需要先对URL进行一些检查:

$("a").each(function(){ 
    var element = $(this);
    var href = element.attr("href");
    if (href.indexOf("http://someUrl") > -1){ 
        element..wrap("<span class='test_class' />");
    }
});
$(“a”).each(function(){
var元素=$(此);
var href=element.attr(“href”);
如果(href.indexOf)(“http://someUrl") > -1){ 
元素..换行(“”);
}
});
如果没有jQuery,可以这样做:

$("a").wrap("<span class='test_class' />");
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); 
}
var elements=document.body.getElementsByTagName(“a”);
对于(var i=0;i
您可以使用文档界面在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);
    }
}
DocumentBuilder=DocumentBuilderFactory.newDocumentBuilder();
documentdoc=builder.parse(yourJavaHtmlString);
NodeList nodes=doc.getElementsByTagName(“a”);
对于(int i=0;i
将我的评论转化为答案,正则表达式不是合适的工具。我建议使用像John Cowan的“”这样的解析器来编写一些代码来过滤HTML。如果您更喜欢类似DOM而不是类似SAX的东西,那么有一个

如果您完全确定要使用正则表达式,并且正在使用PCRE或其他支持前瞻的正则表达式引擎,则可以使用断言,因此此正则表达式可以为您完成以下任务:

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

s.replaceAll(“]*?>”(?!尝试使用正则表达式执行此操作听起来很痛苦。也许您可以使用?您是否正在处理格式良好的HTML文档或嵌入纯文本的标记(如示例中所示)?regex+html=pain。改用DOM:我感觉到了使用regex的痛苦,但没有其他出路。出于某种奇怪的原因,我从另一个服务接收html bosy文本作为字符串。我需要做一些格式化和预处理,其中一部分是我提出的问题。没有XSLT的余地。我同意Brandon:regular expressions不是这项工作的合适工具。我建议使用John Cowan的“TagSoup”之类的解析器来编写一些代码来过滤HTML。如果您更喜欢类似DOM而不是SAX,那么NekoHTML.OP确实说了“java”,所以我认为包装应该在服务器端完成,这排除了javascript。感谢Adam..不幸的是,没有他需要在java代码中出现。很抱歉,没有注意到您想要在java中使用它。我尝试了下面的正则表达式,它可以很好地进行添加,但我无法筛选图像href。这是添加all-all标记。testStr.replaceAll(“]*>(.+?)”,“$0”);我补充了如何使用Java中的文档接口在Java中完成同样的事情。感谢Keith抽出时间。您的解决方案非常有效。我同意您的观点,解析器是最好的解决方案。话虽如此,我收到的这个字符串没有任何html或body标记,但它应该表示body内容。它不会混淆rm也符合标准。我认为,大多数解析器在解析过程中都会失败。除此之外,它是一个相当小的字符串,出现了一些标记,这促使我选择了正则表达式。非常感谢您的帮助,非常感谢。