Мое решение для регулярных выражений javascript (правильно обработанные вложенные теги)
Алгоритм:
- От всех совпадений регулярных выражений до открывающего тега мы берем последнее совпадение
- Временно удалить текст перед последним открывающим тегом и сам тег
- В оставшемся тексте мы ищем первый закрывающий тег и помечаем его как
</tagnameGUID>
И повторите это для других матчей:)
Функция не анализирует самозакрывающиеся теги
function get_arr_tags(txt, tag) {
function S4() {
return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
}
function GUID() {
return (S4() + S4()).toUpperCase();
}
var arr = [];
if (!txt || !tag) return arr;
var r_open = null;
var r_close = null;
var guid = GUID();
r_open = RegExp('<' + tag + '\\b[^>\\/]*?>', 'gi');
r_close = RegExp('<\\s*?\/\\s*?(' + tag + ')\\b[^>]*?>', 'gi');
var m_arr = [];
for (match = r_open.exec(txt); match != null; match = r_open.exec(txt)) {
m_arr.push(match);
}
for (var i = m_arr.length - 1; i >= 0; i--) {
var last_m_open = m_arr[i];
r_close.lastIndex = 0;
var frst_m_close = r_close.exec(txt.substring(last_m_open.index));
var real_close_idx = last_m_open.index + frst_m_close.index;
var obj = {
'begin_idx': last_m_open.index,
'open_tag': last_m_open[0],
'close_tag': frst_m_close[0],
'outerHTML': txt.substring(last_m_open.index, real_close_idx + frst_m_close[0].length).replace(RegExp(guid, 'g'), ''),
'innerHTML': txt.substring(last_m_open.index + last_m_open[0].length, real_close_idx).replace(RegExp(guid, 'g'), '')
}
obj.close_tag_begin = obj.begin_idx + obj.open_tag.length + obj.innerHTML.length;
obj.end_idx = obj.close_tag_begin + obj.close_tag.length;
arr.splice(0, 0, obj);
txt = txt.substring(0, real_close_idx) +
txt.substring(real_close_idx, real_close_idx + frst_m_close[0].length)
.replace(frst_m_close[1], frst_m_close[1] + guid) +
txt.substring(real_close_idx + frst_m_close[0].length);
}
return arr;
}
Использование:
var txt = '<table>' +
'<tr><td>1' +
'<table><tr><td>2' +
'<table><tr><td>3' +
'</td></tr></table><table>inner_3</table>' +
'</td></tr></table>' +
'</td></tr>' +
'</table>' +
'<table>1st</table>' +
'<table>2nd</table>';
var arr = get_arr_tags(txt, 'table');
Для вашего примера:
var txt = '<div class="nice">' +
'<a href="http://www.google.com">Hello</a>' +
'<div>World</div>' +
'</div>';
var arr = get_arr_tags(txt, 'div');