Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.11.2014, 23:30
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

перевод таблицы в массив
Есть html-код таблицы, находящийся в переменной var htm - таблица динамическая, и кол-во строк - может меняться (от 0 - таблица пустая до бесконечности =) впрочем, более 20 строк не ожидается)
нужно спарсить эту таблицу, и получить данные в виде массива

// куча пробелов оставлена специально ибо в таком виде таблица попадает в переменную
var htm='<tbody style="outline: 1px solid blue;">            <tr>        <td class="complKnowlege" style="vertical-align:middle;text-align:center">         1        </td>        <td class="complKnowlege" style="vertical-align:middle;">         АБС  "ЭНИКЕЙЩИКИ И КО"        </td>        <td style="vertical-align:middle;">         ЮЛ        </td>                 <td style="vertical-align:middle;">          032600003909         </td>                <td style="vertical-align:middle;">         000240014809        </td>        <td style="vertical-align:middle;">         11.02.2000        </td>        <td style="vertical-align:middle;">                 </td>        <td class="complKnowlege" style="vertical-align:middle;">                 </td>                 <td class="complKnowlege" style="vertical-align:middle;">         Дата :<span class="grayText">05.06.2009 </span> Тип :<span class="grayText">Признан недействительным </span>        </td>       </tr>          </tbody>';
alert(htm.replace(/\s+/gim,' ').match(/<td.*?>(.*?)<\/td>/g));


единственное, чего, пока что, удалось мне добиться - это удаления лишних тегов и впечатления, что я иду не тем путем =)
Просьба помочь разобраться, как спарсить не <td>any text</td>... а только "any text" и при этом раскидать его по массиву, в котором каждая ячейка массива - это ячейка из таблицы


текущий результат работы скрипта:
Код:
	0: <td class="complKnowlege" style="vertical-align:middle;text-align:center"> 1 </td>
	1: <td class="complKnowlege" style="vertical-align:middle;"> АБС "ЭНИКЕЙЩИКИ И КО" </td>
	2: <td style="vertical-align:middle;"> ЮЛ </td>
	3: <td style="vertical-align:middle;"> 032600003909 </td>
	4: <td style="vertical-align:middle;"> 000240014809 </td>
	5: <td style="vertical-align:middle;"> 11.02.2000 </td>
	6: <td style="vertical-align:middle;"> </td>
	7: <td class="complKnowlege" style="vertical-align:middle;"> </td>
	8: <td class="complKnowlege" style="vertical-align:middle;"> Дата :<span class="grayText">05.06.2009 </span> Тип :<span class="grayText">Признан недействительным </span> </td>

Последний раз редактировалось Cache, 15.11.2014 в 23:59. Причина: правка рег.выражения
Ответить с цитированием
  #2 (permalink)  
Старый 15.11.2014, 23:57
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Для начала: никогда не использовать регулярные выражения для разбора html.

Делать следует примерно так:
var htm='<tbody style="outline: 1px solid blue;">            <tr>        <td class="complKnowlege" style="vertical-align:middle;text-align:center">         1        </td>        <td class="complKnowlege" style="vertical-align:middle;">         АБС  "ЭНИКЕЙЩИКИ И КО"        </td>        <td style="vertical-align:middle;">         ЮЛ        </td>                 <td style="vertical-align:middle;">          032600003909         </td>                <td style="vertical-align:middle;">         000240014809        </td>        <td style="vertical-align:middle;">         11.02.2000        </td>        <td style="vertical-align:middle;">                 </td>        <td class="complKnowlege" style="vertical-align:middle;">                 </td>                 <td class="complKnowlege" style="vertical-align:middle;">         Дата :<span class="grayText">05.06.2009 </span> Тип :<span class="grayText">Признан недействительным </span>        </td>       </tr>             <tr>        <td class="complKnowlege" style="vertical-align:middle;text-align:center">         1        </td>        <td class="complKnowlege" style="vertical-align:middle;">         АБС  "ЭНИКЕЙЩИКИ И КО"        </td>        <td style="vertical-align:middle;">         ЮЛ        </td>                 <td style="vertical-align:middle;">          032600003909         </td>                <td style="vertical-align:middle;">         000240014809        </td>        <td style="vertical-align:middle;">         11.02.2000        </td>        <td style="vertical-align:middle;">                 </td>        <td class="complKnowlege" style="vertical-align:middle;">                 </td>                 <td class="complKnowlege" style="vertical-align:middle;">         Дата :<span class="grayText">05.06.2009 </span> Тип :<span class="grayText">Признан недействительным </span>        </td>       </tr>          </tbody>';

parse = (function(){
   var div = document.createElement('div'), 
       text = 'textContent' in div ? 'textContent' : 'innerText',
       map = Array.prototype.map;
   return function parse(htm){
      div.innerHTML = '<table>' + htm + '</table>';
      return map.call( div.firstChild.rows, function(row){
         return map.call( row.cells, function(cell){
            return cell[text].trim();
         })
      })
   }
}());


alert(JSON.stringify( 
   parse(htm)
, null, '\t'))

Для поддержки старых браузеров потребуются полифилы для Array.prototype.map и String.prototype.trim.
__________________
29375, 35

Последний раз редактировалось Aetae, 16.11.2014 в 00:01.
Ответить с цитированием
  #3 (permalink)  
Старый 16.11.2014, 00:00
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

Aetae, проблема в том, что нельзя использовать document. и JSON.
они просто не поддерживаются приложением

Последний раз редактировалось Cache, 16.11.2014 в 00:03.
Ответить с цитированием
  #4 (permalink)  
Старый 16.11.2014, 00:01
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

<html>
<head>
<meta charset="windows-1251" />
</head>
<body>
<script>
var htm='<tbody style="outline: 1px solid blue;">            <tr>        <td class="complKnowlege" style="vertical-align:middle;text-align:center">         1        </td>        <td class="complKnowlege" style="vertical-align:middle;">         АБС  "ЭНИКЕЙЩИКИ И КО"        </td>        <td style="vertical-align:middle;">         ЮЛ        </td>                 <td style="vertical-align:middle;">          032600003909         </td>                <td style="vertical-align:middle;">         000240014809        </td>        <td style="vertical-align:middle;">         11.02.2000        </td>        <td style="vertical-align:middle;">                 </td>        <td class="complKnowlege" style="vertical-align:middle;">                 </td>                 <td class="complKnowlege" style="vertical-align:middle;">         Дата :<span class="grayText">05.06.2009 </span> Тип :<span class="grayText">Признан недействительным </span>        </td>       </tr>          </tbody>';
s=htm.replace(/<[^>]+>/g, "")
s=s.replace(/\s+/g, " ")
alert(s.split(" "))
console.log(s.split(" "))
</script>
</body>
</html>

Последний раз редактировалось krutoy, 16.11.2014 в 00:05.
Ответить с цитированием
  #5 (permalink)  
Старый 16.11.2014, 00:12
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Cache, а откуда приходит эта таблица? Может там на месте сразу её и обрабатывать, а в "приложение" пускай приходит уже чистенький массив?

P.S. Если нет JSON значит древняя версия js, скорее всего на винде. Если на винде установлен современный ie, то вроде как-то можно включить в скрипте современный движок. Это конечно зависит то того что это за "приложение" такое.
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 16.11.2014, 00:13
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

Ваш результат:
Код:
,1,АБС,"ЭНИКЕЙЩИКИ,И,КО",ЮЛ,032600003909,000240014809,11.02.2000,Дата,:05.06.2009,Тип,:Признан,недействительным,
в нем каждое слово - элемент массива, а мне не каждое слово нужно, а текст из каждого блока <td>
Ответить с цитированием
  #7 (permalink)  
Старый 16.11.2014, 00:14
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

Сообщение от Aetae Посмотреть сообщение
Если нет JSON значит древняя версия js, скорее всего на винде. Если на винде установлен современный ie, то вроде как-то можно включить в скрипте современный движок. Это конечно зависит то того что это за "приложение" такое.
не знаю как, но они выпилены из приложения: ReferenceError: document is not defined

Сообщение от Aetae Посмотреть сообщение
Cache, а откуда приходит эта таблица? Может там на месте сразу её и обрабатывать, а в "приложение" пускай приходит уже чистенький массив?
из веб-страницы

Последний раз редактировалось Cache, 16.11.2014 в 00:34. Причина: грамматика, будь она не ладна))
Ответить с цитированием
  #8 (permalink)  
Старый 16.11.2014, 00:22
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

Cache, Вот это уже ближе?
<html>
<head>
<meta charset="windows-1251" />
</head>
<body>
<script>
var htm='<tbody style="outline: 1px solid blue;">            <tr>        <td class="complKnowlege" style="vertical-align:middle;text-align:center">         1        </td>        <td class="complKnowlege" style="vertical-align:middle;">         АБС  "ЭНИКЕЙЩИКИ И КО"        </td>        <td style="vertical-align:middle;">         ЮЛ        </td>                 <td style="vertical-align:middle;">          032600003909         </td>                <td style="vertical-align:middle;">         000240014809        </td>        <td style="vertical-align:middle;">         11.02.2000        </td>        <td style="vertical-align:middle;">                 </td>        <td class="complKnowlege" style="vertical-align:middle;">                 </td>                 <td class="complKnowlege" style="vertical-align:middle;">         Дата :<span class="grayText">05.06.2009 </span> Тип :<span class="grayText">Признан недействительным </span>        </td>       </tr>          </tbody>';
//console.log(htm.replace(/\s+/gim,' ').match(/<td(.*?)>\s*<\/td>/gim));
s=htm.replace(/<[^>]+>/g, "|||")
s=s.replace(/\s+/g, " ")
arr=s.split("|||")
newArr=[]
for(i in arr){
if(/^\s*$/.test(arr[i])) continue; newArr.push(arr[i])
}
alert(newArr)
console.log(newArr)
</script>
</body>
</html>

Щас, еслине засну, допилю может быть
Ответить с цитированием
  #9 (permalink)  
Старый 16.11.2014, 00:28
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

Aetae,
исходя из вашего примера сделал следующее:
var htm='<tbody style="outline: 1px solid blue;">            <tr>        <td class="complKnowlege" style="vertical-align:middle;text-align:center">         1        </td>        <td class="complKnowlege" style="vertical-align:middle;">         АБС  "ЭНИКЕЙЩИКИ И КО"        </td>        <td style="vertical-align:middle;">         ЮЛ        </td>                 <td style="vertical-align:middle;">          032600003909         </td>                <td style="vertical-align:middle;">         000240014809        </td>        <td style="vertical-align:middle;">         11.02.2000        </td>        <td style="vertical-align:middle;">                 </td>        <td class="complKnowlege" style="vertical-align:middle;">                 </td>                 <td class="complKnowlege" style="vertical-align:middle;">         Дата :<span class="grayText">05.06.2009 </span> Тип :<span class="grayText">Признан недействительным </span>        </td>       </tr>          </tbody>';

htm=htm.match(/<td.*?>(.*?)<\/td>/g);
for(var key in htm){htm[key]=htm[key].replace(/<[^>]+>/g, '').trim().replace(/\s{2,}/gim,' ');};
alert(htm);

Последний раз редактировалось Cache, 16.11.2014 в 00:47. Причина: небольшая оптимизация, призванная убрать лишние пробелы после удаления </span>
Ответить с цитированием
  #10 (permalink)  
Старый 16.11.2014, 00:30
Кандидат Javascript-наук
Отправить личное сообщение для Cache Посмотреть профиль Найти все сообщения от Cache
 
Регистрация: 02.05.2013
Сообщений: 111

krutoy, ближе, но последнюю ячейку разбивает на несколько элементов из-за присутствия тега <span> и пропускает пустые ячейки, что не допустимо

Последний раз редактировалось Cache, 16.11.2014 в 00:32.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализация таблицы с многими параметрами Иннокентий Общие вопросы Javascript 1 14.09.2014 21:18
Создание таблицы с чекбоксом используя массив jeka Javascript под браузер 3 09.04.2014 17:23
Через ajax отправить много данных из таблицы на сервер Heger jQuery 3 29.08.2012 18:51
Как создать многомерный массив FRIE Общие вопросы Javascript 29 02.06.2010 19:14
Подскажите, как вернуть js-скрипт массив Polkan AJAX и COMET 18 30.04.2010 23:30