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
Каждый вызов нашей анонимной функции будет получать три токена в качестве второго, третьего и четвертого аргументов, а именно arguments [1], arguments [2], arguments [3]:
- arguments [1] - это якорь целиком
- arguments [2] - это href-часть
- arguments [3] - это текст внутри
Мы воспользуемся хитростями, чтобы вставить эти три аргумента в виде нового массива в наш основной массив matches
. Встроенная переменная arguments
не является истинным массивом JavaScript, поэтому нам придется применить к ней метод split
Array, чтобы извлечь нужные нам элементы:
Array.prototype.slice.call(arguments, 1, 4)
Это будет извлекать элементы из arguments
, начиная с индекса 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
15.12.2008
while (tokens = regex.exec(patt))
вместоreplace
хака. 03.02.2010