JavaScript regex для извлечения текста привязки и URL от тегов привязки

Вы можете сделать это с отражением, если переменные определены как члены класса. Для параметров метода или локальных переменных это невозможно. Что-то похожее на это:

Class currentClass = getClass();
Field[] fields = currentClass.getFields();
for (Field f : fields) {
  System.out.println(f.getName());
}

Если вы намерены изменить значение, оно становится немного более сложным, так как вам также необходимо рассмотреть тип переменной. Например. вы можете назначить String переменной типа Object, но не наоборот.

14
задан chipotle_warrior 15 December 2008 в 17:40
поделиться

4 ответа

var matches = [];

input_content.replace(/[^<]*(<a href="([^"]+)">([^<]+)<\/a>)/g, function () {
    matches.push(Array.prototype.slice.call(arguments, 1, 4))
});

Это предполагает, что Ваши привязки всегда будут в форме <a href="...">...</a>, т.е. она не будет работать, если будут какие-либо другие атрибуты (например, target). Регулярное выражение может быть улучшено для размещения этого.

Для разрушения регулярного выражения:

/ -> start regular expression
  [^<]* -> skip all characters until the first <
  ( -> start capturing first token
    <a href=" -> capture first bit of anchor
    ( -> start capturing second token
        [^"]+ -> capture all characters until a "
    ) -> end capturing second token
    "> -> capture more of the anchor
    ( -> start capturing third token
        [^<]+ -> capture all characters until a <
    ) -> end capturing third token
    <\/a> -> capture last bit of anchor
  ) -> end capturing first token
/g -> end regular expression, add global flag to match all anchors in string

Каждый вызов к нашей анонимной функции получит три маркера как вторые, третьи и четвертые аргументы, а именно, аргументы [1], аргументы [2], аргументы [3]:

  • аргументами [1] является вся привязка
  • , аргументами [2] являются href аргументы части
  • [3], текст в

, Мы будем использовать взлом для продвижения этих трех аргументов как нового массива в наше основное matches массив. arguments встроенной переменной не является истинный Массив JavaScript, таким образом, мы должны будем подать заявку split метод Массива на ней для извлечения объектов, мы хотим:

Array.prototype.slice.call(arguments, 1, 4)

Это извлечет объекты от [1 110], запуск в индексе 1 и окончание (не включительно) в индексе 4.

var input_content = "blah \
    <a href=\"http://yahoo.com\">Yahoo</a> \
    blah \
    <a href=\"http://google.com\">Google</a> \
    blah";

var matches = [];

input_content.replace(/[^<]*(<a href="([^"]+)">([^<]+)<\/a>)/g, function () {
    matches.push(Array.prototype.slice.call(arguments, 1, 4));
});

alert(matches.join("\n"));

Дают:

<a href="http://yahoo.com">Yahoo</a>,http://yahoo.com,Yahoo
<a href="http://google.com">Google</a>,http://google.com,Google
45
ответ дан 1 December 2019 в 05:55
поделиться

Так как Вы, по-видимому, запускаете JavaScript в веб-браузере, regex походит на плохую идею для этого. Если абзац прибыл из страницы во-первых, получите дескриптор для контейнера, звоните .getElementsByTagName(), чтобы получить привязки и затем извлечь значения, Вы хотите тот путь.

, Если это не возможно затем, создают новый объект элемента HTML, присваивают Ваш текст, он - .innerHTML свойство, и затем звоните .getElementsByTagName().

10
ответ дан 1 December 2019 в 05:55
поделиться

Я думаю , JQuery был бы Вашим лучшим выбором. Это не лучший сценарий, и я уверен, что другие могут дать что-то лучше. Но это создает массив точно, что Вы ищете.

<script type="text/javascript">
    // From http://brandonaaron.net Thanks!
    jQuery.fn.outerHTML = function() {
        return $('<div>').append( this.eq(0).clone() ).html();
    };    

    var items = new Array();
    var i = 0;

    $(document).ready(function(){
        $("a").each(function(){
            items[i] = {el:$(this).outerHTML(),href:this.href,text:this.text};
            i++;      
        });
    });

    function showItems(){
        alert(items);
    }

</script>
2
ответ дан 1 December 2019 в 05:55
поделиться

Я думаю, что Joel имеет право его, — regexes известны за проигрывание плохо с разметкой, поскольку существует просто слишком много возможностей рассмотреть. Там другие атрибуты к тегам привязки? В каком порядке они? Отделяющийся пробел всегда является одиночным пробелом? При наблюдении, поскольку у Вас уже есть синтаксический анализатор HTML браузера доступный, лучше всего для помещения этого для работы вместо этого.

function getLinks(html) {
    var container = document.createElement("p");
    container.innerHTML = html;

    var anchors = container.getElementsByTagName("a");
    var list = [];

    for (var i = 0; i < anchors.length; i++) {
        var href = anchors[i].href;
        var text = anchors[i].textContent;

        if (text === undefined) text = anchors[i].innerText;

        list.push(['<a href="' + href + '">' + text + '</a>', href, text];
    }

    return list;
}

Это возвратит массив как тот, который Вы описываете независимо от того, как ссылки хранятся. Обратите внимание, что Вы могли изменить функцию для работы с переданным элементом вместо текста путем изменения названия параметра к "контейнеру" и удаления первых двух строк. textContent/innerText свойство отобразило текст для ссылки, лишенной любой разметки (bold/italic/font/†¦). Вы могли заменить .textContent .innerHTML и удалить внутреннее, если () оператор, если Вы хотите сохранить разметку.

7
ответ дан 1 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: