Regex для добавления тега <span>перед <a> - PullRequest
1 голос
/ 18 марта 2011

Мне нужно написать утилиту для добавления тега перед любым

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-адрес, указывающий на физическую страницу, а не на изображение.

Я планировал использовать регулярные выражения для достижения этой цели, но пока без удачи.

Любой указатель на этобыть высоко оцененным.

-Спасибо

Ответы [ 2 ]

2 голосов
/ 18 марта 2011

Превращая мой комментарий в ответ, регулярные выражения не являются подходящим инструментом для работы. Я бы посоветовал использовать такой синтаксический анализатор, как « TagSoup » Джона Коуэна, чтобы написать код для фильтрации HTML. Если вы предпочитаете что-то более DOM-подобное SAX-подобному, есть NekoHTML .

Если вы абсолютно уверены, что хотите пойти по маршруту регулярных выражений и используете PCRE или другой механизм регулярных выражений, который поддерживает упреждающий просмотр, вы можете использовать утверждения, поэтому это регулярное выражение может выполнить эту работу за вас:

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

Я не проверял это, но суть верна. Важная вещь - это (?!<img.*), которая утверждает, что вы не хотите совпадать с <img, за которым следует что-либо в этой позиции. Это может помочь вам, но я по-прежнему придерживаюсь мнения, что небольшой разбор - лучший путь.

1 голос
/ 18 марта 2011

Если на странице есть библиотека типа 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); 
}

Вы можете сделать что-то очень похожее в Java, используя интерфейс Document:

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...