Вы можете сделать это с отражением, если переменные определены как члены класса. Для параметров метода или локальных переменных это невозможно. Что-то похожее на это:
Class currentClass = getClass();
Field[] fields = currentClass.getFields();
for (Field f : fields) {
System.out.println(f.getName());
}
Если вы намерены изменить значение, оно становится немного более сложным, так как вам также необходимо рассмотреть тип переменной. Например. вы можете назначить String
переменной типа Object
, но не наоборот.
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]:
, Мы будем использовать взлом для продвижения этих трех аргументов как нового массива в наше основное 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
Так как Вы, по-видимому, запускаете JavaScript в веб-браузере, regex походит на плохую идею для этого. Если абзац прибыл из страницы во-первых, получите дескриптор для контейнера, звоните .getElementsByTagName()
, чтобы получить привязки и затем извлечь значения, Вы хотите тот путь.
, Если это не возможно затем, создают новый объект элемента HTML, присваивают Ваш текст, он - .innerHTML свойство, и затем звоните .getElementsByTagName()
.
Я думаю , 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>
Я думаю, что 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 и удалить внутреннее, если () оператор, если Вы хотите сохранить разметку.