перевод таблицы в массив
Есть 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> |
Для начала: никогда не использовать регулярные выражения для разбора 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. |
Aetae, проблема в том, что нельзя использовать document. и JSON.
они просто не поддерживаются приложением |
<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> |
Cache, а откуда приходит эта таблица? Может там на месте сразу её и обрабатывать, а в "приложение" пускай приходит уже чистенький массив?
P.S. Если нет JSON значит древняя версия js, скорее всего на винде. Если на винде установлен современный ie, то вроде как-то можно включить в скрипте современный движок. Это конечно зависит то того что это за "приложение" такое. |
Ваш результат:
Код:
,1,АБС,"ЭНИКЕЙЩИКИ,И,КО",ЮЛ,032600003909,000240014809,11.02.2000,Дата,:05.06.2009,Тип,:Признан,недействительным, |
Цитата:
Цитата:
|
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> Щас, еслине засну, допилю может быть:) |
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); |
krutoy, ближе, но последнюю ячейку разбивает на несколько элементов из-за присутствия тега <span> и пропускает пустые ячейки, что не допустимо
|
Часовой пояс GMT +3, время: 14:05. |