Created
June 6, 2018 16:43
-
-
Save codedokode/80913ab9d9279bf30878ff60c48515dc to your computer and use it in GitHub Desktop.
Программа обнаружения повторяющихся фрагментов текста и результат ее применения к сломанным тредам
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/tmp/threads/pr-thread-4-272705-m2ch-18-may-google.html | |
Total repeats: 185567 of 454322 bytes | |
- 0 - 41080 | \n<meta http-equiv="Content-Type" content ... ss="reply" id="27307 | |
first 1 41081 - 85327 | 5"><div class="pst_bar"><span class="pos ... ://m2-ch.ru/pr/res/2 | |
second 1 85328 - 129574 | 5"><div class="pst_bar"><span class="pos ... ://m2-ch.ru/pr/res/2 | |
- 129575 - 129593 | 72705.html#273385"> | |
first 2 129594 - 177012 | >>273385</a><br><br><span class="u ... ;А если надо сюда HT | |
- 177013 - 177034 | 72705.html#273385"> | |
second 2 177035 - 224453 | >>273385</a><br><br><span class="u ... ;А если надо сюда HT | |
- 224454 - 224621 | ML-тегов с аттрибутами добавить? У тебя ... виджет сделан.</span | |
first 3 224622 - 270150 | ><br>Ну добавляешь, кто мешает? Компонен ... 59">>>275659</ | |
- 270151 - 270163 | ml-тегов | |
second 3 270164 - 315692 | ><br>Ну добавляешь, кто мешает? Компонен ... 59">>>275659</ | |
first 4 315693 - 364064 | a><br><br>Рад, что ты сам разобрался.<br ... ки несколько раз. <b | |
second 4 364065 - 412436 | a><br><br>Рад, что ты сам разобрался.<br ... ки несколько раз. <b | |
- 412437 - 454321 | r><br>Это не виджеты, это один большой н ... ru&client=opera -->\n | |
/tmp/test/pr-thread1.html | |
Total repeats: 1279393 of 2599187 bytes | |
- 0- 11281, 11282 | <!DOCTYPE html><html xmlns="http://www.w ... /" title="конец свет | |
first 1 11282- 13674, 2393 | а">ew</a> / <a href="http://2ch.hk/fa/" ... ика и оружие">wm</a> | |
- 13675- 13735, 61 | / <a href="http://2ch.hk/chat/" title="Двач чат">chat | |
first 2 13736- 15146, 1411 | </a>]</span> <span class="no ... 2ch.hk/wr/" title="▒ | |
- 15147- 15189, 43 | ▒екстовые авторские рпг | |
first 3 15190- 17449, 2260 | ">wr</a>]</span> <span class ... k</a>]</span> </div> | |
- 17450- 38695, 21246 | </div> <div class="mobile" id="boardNavM ... turn false;" onmouse | |
first 4 38696- 76402, 37707 | out="javascript:removeAdminMenu(event); ... "><span class="name" | |
- 76403- 76403, 1 | | |
second 4 76404-114110, 37707 | out="javascript:removeAdminMenu(event); ... "><span class="name" | |
first 5 114111-149330, 35220 | >Аноним</span> <br><span clas ... ew(event)" onmouseou | |
second 5 149331-184550, 35220 | >Аноним</span> <br><span clas ... ew(event)" onmouseou | |
first 6 160479-165119, 4641 | <strong>SAGE</strong> <strong>SAGE</stro ... strong>SAGE</strong> | |
second 6 160985-165625, 4641 | <strong>SAGE</strong> <strong>SAGE</stro ... strong>SAGE</strong> | |
- 165626-167260, 1635 | </p></blockquote></td></tr></tbody></tab ... ss="postMessage"><p> | |
first 7 167261-175993, 8733 | <strong>SAGE</strong> <strong>SAGE</stro ... strong>SAGE</strong> | |
second 7 167767-176499, 8733 | <strong>SAGE</strong> <strong>SAGE</stro ... strong>SAGE</strong> | |
- 176500-184651, 8152 | </p></blockquote></td></tr></tbody></tab ... "highlight(236505)"> | |
first 8 184652-223944, 39293 | >>236505</a><br>У всех баттхёрт не ... там только теория, | |
- 223945-224035, 91 | t="delPostPreview(event)" href="/pr/res/ ... ghlight(236505)"> | |
second 8 224036-263328, 39293 | >>236505</a><br>У всех баттхёрт не ... там только теория, | |
first 9 263329-303269, 39941 | где все задание заключается в нажатии su ... eteGood и.т.д.<br>П▒ | |
second 9 303269-343209, 39941 | где все задание заключается в нажатии su ... eteGood и.т.д.<br>П▒ | |
- 343210-343339, 130 | ▒дскажите, пожалуйста, решение или выска ... еи по этому поводу</ | |
first 10 343340-382617, 39278 | p></blockquote></td></tr></tbody></table ... >}<br>break_label:<b | |
- 382618-382756, 139 | одскажите, пожалуйста, решение и ... еи по этому поводу< | |
second 10 382757-422034, 39278 | p></blockquote></td></tr></tbody></table ... >}<br>break_label:<b | |
- 422035-422795, 761 | r>... продолжение программы<br><br>Объяс ... _237302" class="post | |
first 11 422796-460169, 37374 | "><tbody><tr><td class="reply" id="23730 ... an class="postertrip | |
- 460170-460924, 755 | r />... продолжение программы<br /><br / ... ble id=" post_237302 | |
second 11 460925-498298, 37374 | "><tbody><tr><td class="reply" id="23730 ... an class="postertrip | |
first 12 498299-535887, 37589 | ">!xnn2uE3AU.</span> <span class="p ... tml#237603">№</a><a | |
second 12 535888-573476, 37589 | ">!xnn2uE3AU.</span> <span class="p ... tml#237603">№</a><a | |
- 573477-573573, 97 | href="javascript:insert('>>237603')" onc ... 3'); return false;"> | |
first 13 573574-611136, 37563 | 237603</a><br><span class="postpanel"><a ... ыло бы любопытно пос | |
- 611137-611242, 106 | href="javascript:insert('>>237603' ... ; return false;"> | |
second 13 611243-648805, 37563 | 237603</a><br><span class="postpanel"><a ... ыло бы любопытно пос | |
- 648806-649062, 257 | мотреть. Заодно проверить, так ли удобен ... _237821" class="post | |
first 14 649063-687398, 38336 | "><tbody><tr><td class="reply" id="23782 ... ;" onmouseout="javas | |
- 687399-687654, 256 | мотреть. Заодно проверить, так ли удобен ... id=" post_237821"=" | |
second 14 687655-725990, 38336 | "><tbody><tr><td class="reply" id="23782 ... ;" onmouseout="javas | |
first 15 725991-763137, 37147 | cript:removeAdminMenu(event); return fal ... ipt:removeAdminMenu( | |
second 15 763138-800284, 37147 | cript:removeAdminMenu(event); return fal ... ipt:removeAdminMenu( | |
first 16 800285-836592, 36308 | event); return false;"></a></span> ... ick="javascript:addQ | |
second 16 836593-872900, 36308 | event); return false;"></a></span> ... ick="javascript:addQ | |
first 17 872901-910583, 37683 | uickReply('240883'); return false;"></a> ... javascript:insert('> | |
- 910584-910588, 5 | & | |
second 17 910589-948271, 37683 | uickReply('240883'); return false;"></a> ... javascript:insert('> | |
- 948272-948272, 1 | > | |
first 18 948273-985370, 37098 | 241122')" onclick="javascript:addQuickRe ... pan class="postpanel | |
- 985371-985373, 3 | gt; | |
second 18 985374-1022471, 37098 | 241122')" onclick="javascript:addQuickRe ... pan class="postpanel | |
first 19 1022472-1059465, 36994 | "><a class="postbtn_rep" href="http://2c ... onclick="javascript: | |
second 19 1059466-1096459, 36994 | "><a class="postbtn_rep" href="http://2c ... onclick="javascript: | |
first 20 1096460-1135728, 39269 | addQuickReply('241974'); return false;"> ... 67214" class="postIn | |
second 20 1135729-1174997, 39269 | addQuickReply('241974'); return false;"> ... 67214" class="postIn | |
- 1174998-1175000, 3 | foM | |
first 21 1175001-1213593, 38593 | mobile"><span class="nameBlock"><span c ... 42218"></a><blockquo | |
- 1213594-1213596, 3 | fom | |
second 21 1213597-1252189, 38593 | mobile"><span class="nameBlock"><span c ... 42218"></a><blockquo | |
- 1252190-1252224, 35 | te id="m242218" class="postMessage" | |
first 22 1252225-1296010, 43786 | ><p><a onmouseover="showPostPreview(even ... trip">!xnn2uE3AU.</s | |
- 1296011-1296012, 2 | te | |
second 22 1296013-1339798, 43786 | ><p><a onmouseover="showPostPreview(even ... trip">!xnn2uE3AU.</s | |
- 1339799-1339825, 27 | pan> <br><span class=" | |
first 23 1339826-1378510, 38685 | subject"></span></span><span data-utc="1 ... over="showPostPrevie | |
- 1378511-1378538, 28 | pan> <br><span class=" | |
second 23 1378539-1417223, 38685 | subject"></span></span><span data-utc="1 ... over="showPostPrevie | |
- 1417224-1417287, 64 | w(event)" onmouseout="delPostPreview(eve ... href="http://2ch.hk | |
first 24 1417288-1454922, 37635 | /pr/res/236463.html#242501" onclick="hig ... "242690"></a><blockq | |
- 1454923-1454973, 51 | w(event)" onmouseout="delPostPreview(event)" href=" | |
second 24 1454974-1492608, 37635 | /pr/res/236463.html#242501" onclick="hig ... "242690"></a><blockq | |
- 1492609-1492646, 38 | uote id="m242690" class="postMessage"> | |
first 25 1492647-1530877, 38231 | <p><a onmouseover="showPostPreview(event ... r>Алсо, добавлю, что | |
- 1530878-1530919, 42 | uote id="m242690" class="postMessage"> | |
second 25 1530920-1569150, 38231 | <p><a onmouseover="showPostPreview(event ... r>Алсо, добавлю, что | |
- 1569151-1569151, 1 | , | |
first 26 1569152-1605852, 36701 | задание на мой взгляд простейшее. Если ... ая копия, оригинал п | |
- 1605853-1605854, 2 | 4; | |
second 26 1605855-1642555, 36701 | задание на мой взгляд простейшее. Если ... ая копия, оригинал п | |
- 1642556-1642571, 16 | о клику.</ | |
first 27 1642572-1678852, 36281 | span></span><br class="turnmeoff"><span ... le id="post_243365" | |
- 1678853-1678868, 16 | о клику.< | |
second 27 1678869-1715149, 36281 | span></span><br class="turnmeoff"><span ... le id="post_243365" | |
- 1715150-1715162, 13 | class="post"> | |
first 28 1715163-1755034, 39872 | <tbody><tr><td class="reply" id="243365" ... естно).<br>Реализова | |
- 1755035-1755051, 17 | class="post"> | |
second 28 1755052-1794923, 39872 | <tbody><tr><td class="reply" id="243365" ... естно).<br>Реализова | |
- 1794924-1795034, 111 | л я это создав производный класс DBSelec ... pastebin.ru/oK89X5R7 | |
first 29 1795035-1835262, 40228 | " rel="nofollow">http://pastebin.ru/oK89 ... ; return false;" onm | |
- 1835263-1835362, 100 | л="" я="" это="" создав="" производный=" ... select_note="" (<a=" | |
second 29 1835363-1875590, 40228 | " rel="nofollow">http://pastebin.ru/oK89 ... ; return false;" onm | |
- 1875591-1875622, 32 | ouseout="javascript:removeAdminM | |
first 30 1875623-1912843, 37221 | enu(event); return false;"></a></span>&n ... "></a></span> < | |
- 1912844-1912875, 32 | ouseout="javascript:removeadminm | |
second 30 1912876-1950096, 37221 | enu(event); return false;"></a></span>&n ... "></a></span> < | |
- 1950097-1950097, 1 | / | |
first 31 1950098-1988390, 38293 | span></em></span></div><input type="chec ... v id="pim143367214" | |
second 31 1988391-2026683, 38293 | span></em></span></div><input type="chec ... v id="pim143367214" | |
- 2026684-2026707, 24 | class="postInfoM mobile" | |
first 32 2026708-2063923, 37216 | ><span class="nameBlock"><span class="na ... 3 13:45:04 </sp | |
- 2063924-2063939, 16 | class="postinfom | |
second 32 2063940-2101155, 37216 | ><span class="nameBlock"><span class="na ... 3 13:45:04 </sp | |
first 33 2101156-2140031, 38876 | an><span class="reflink"><a href="http:/ ... span> <span cla | |
second 33 2140031-2178906, 38876 | an><span class="reflink"><a href="http:/ ... span> <span cla | |
- 2178907-2178922, 16 | ss="postername"> | |
first 34 2178923-2218972, 40050 | Аноним</span> <span class="po ... переменным никогда | |
- 2218973-2218992, 20 | ass="postername"> | |
second 34 2218993-2259042, 40050 | Аноним</span> <span class="po ... переменным никогда | |
- 2259043-2259136, 94 | не давал.</p></blockquote></td></tr></tb ... _246408" class="post | |
first 35 2259137-2296044, 36908 | "><tbody><tr><td class="reply" id="24640 ... r><span class="postp | |
- 2296045-2296126, 82 | не давал.</p></blockquote></td></tr></tb ... ble id=" post_246408 | |
second 35 2296127-2333034, 36908 | "><tbody><tr><td class="reply" id="24640 ... r><span class="postp | |
first 36 2333035-2373615, 40581 | anel"><a class="postbtn_rep" href="http: ... st_246601" class="po | |
second 36 2373616-2414196, 40581 | anel"><a class="postbtn_rep" href="http: ... st_246601" class="po | |
- 2414197-2414200, 4 | st"> | |
first 37 2414201-2451156, 36956 | <tbody><tr><td class="reply" id="246601" ... о я лох. <br>textf я | |
- 2451157-2451163, 7 | st"> | |
second 37 2451164-2488119, 36956 | <tbody><tr><td class="reply" id="246601" ... о я лох. <br>textf я | |
- 2488120-2488430, 311 | сделал fulltext индексом, но нихуя. FOR ... е полных совпадений, | |
first 38 2488431-2525472, 37042 | а мне нужно полное.<br>Как это все прав ... ss="turnmeoff"><a id | |
- 2525473-2525782, 310 | сделал fulltext индексом, но нихуя. ... лных совпадений, | |
second 38 2525783-2562824, 37042 | а мне нужно полное.<br>Как это все прав ... ss="turnmeoff"><a id | |
- 2562825-2590969, 28145 | ="247420"></a><blockquote id="m247420" c ... живание и самооборон | |
second 1 2590970-2593362, 2393 | а">ew</a> / <a href="http://2ch.hk/fa/" ... ика и оружие">wm</a> | |
second 2 2593359-2594769, 1411 | </a>]</span> <span class="no ... 2ch.hk/wr/" title="▒ | |
- 2594770-2594783, 14 | ▒пг игры | |
second 3 2594784-2597043, 2260 | ">wr</a>]</span> <span class ... k</a>]</span> </div> | |
- 2597044-2599186, 2143 | <hr> <p class="footer"> - <a hr ... res/236463.html -->\n | |
/tmp/test/pr-thread-4b-280501.html | |
Total repeats: 1227965 of 2514267 bytes | |
- 0- 9930, 9931 | <!DOCTYPE html><html xmlns="http://www.w ... "rmenu" id="boardNav | |
first 1 9931- 16795, 6865 | "> <span class="nowrap">Тематика [< ... /a>]</span> </div> < | |
- 16796- 38638, 21843 | /div></div> <div class="mobile" id="boar ... "name">Аноним</span> | |
first 2 38639- 75935, 37297 | <br><span class="subject"></ ... p></blockquote></td> | |
- 75936- 75944, 9 | /span> | |
second 2 75945-113241, 37297 | <br><span class="subject"></ ... p></blockquote></td> | |
first 3 113242-150836, 37595 | </tr></tbody></table><table id="post_280 ... name"></span> < | |
second 3 150836-188430, 37595 | </tr></tbody></table><table id="post_280 ... name"></span> < | |
first 4 188429-226987, 38559 | ;<span class="postertrip">!xnn2uE3AU.</s ... остепенно заменять и | |
second 4 226988-265546, 38559 | ;<span class="postertrip">!xnn2uE3AU.</s ... остепенно заменять и | |
- 265547-265582, 36 | х на нормальный код, | |
first 5 265583-303640, 38058 | начиная с самых важных разделов.<br><br ... ta-utc="1339778953" | |
- 303641-303680, 40 | х на нормальный код, | |
second 5 303681-341738, 38058 | начиная с самых важных разделов.<br><br ... ta-utc="1339778953" | |
- 341739-341763, 25 | class="dateTime postNum"> | |
first 6 341764-381354, 39591 | Срд 22 Май 2013 09:26:16<br><em><span cl ... 1.html#281106">№</a> | |
- 381355-381383, 29 | class="dateTime postNum"> | |
second 6 381384-420974, 39591 | Срд 22 Май 2013 09:26:16<br><em><span cl ... 1.html#281106">№</a> | |
first 7 420975-459088, 38114 | <a href="javascript:insert('>>281106')" ... a id="281173"></a><b | |
second 7 459089-497202, 38114 | <a href="javascript:insert('>>281106')" ... a id="281173"></a><b | |
- 497203-497243, 41 | lockquote id="m281173" class="postMessage | |
first 8 497244-534326, 37083 | "><p><a onmouseover="showPostPreview(eve ... pan class="posternam | |
- 534327-534348, 22 | lockquote id=" m281173 | |
second 8 534349-571431, 37083 | "><p><a onmouseover="showPostPreview(eve ... pan class="posternam | |
first 9 571432-610146, 38715 | e">Аноним</span> <span class= ... </a><blockquote id=" | |
second 9 610147-648861, 38715 | e">Аноним</span> <span class= ... </a><blockquote id=" | |
- 648862-648888, 27 | m281932" class="postMessage | |
first 10 648889-685093, 36205 | "><p><a onmouseover="showPostPreview(eve ... span class="posttime | |
- 685094-685100, 7 | m281932 | |
second 10 685101-721305, 36205 | "><p><a onmouseover="showPostPreview(eve ... span class="posttime | |
first 11 721306-760132, 38827 | ">Втр 28 Май 2013 01:07:25 </span>< ... </a><span class="pos | |
second 11 760133-798959, 38827 | ">Втр 28 Май 2013 01:07:25 </span>< ... </a><span class="pos | |
first 12 798960-838018, 39059 | tpanel"><a class="postbtn_rep" href="htt ... Preview(event)" onmo | |
second 12 838019-877077, 39059 | tpanel"><a class="postbtn_rep" href="htt ... Preview(event)" onmo | |
- 877078-877183, 106 | useout="delPostPreview(event)" href="htt ... "highlight(283084)"> | |
first 13 877184-916763, 39580 | >>283084</a><br><span class="unkfu ... </span> </span> | |
- 916764-916859, 96 | useout="delPostPreview(event)" href="/pr ... ghlight(283084)"> | |
second 13 916860-956439, 39580 | >>283084</a><br><span class="unkfu ... </span> </span> | |
first 14 956440-995436, 38997 | </em></span></div><input type="checkbox" ... вуй, анон. Давай-ка | |
second 14 995437-1034433, 38997 | </em></span></div><input type="checkbox" ... вуй, анон. Давай-ка | |
first 15 1034434-1073082, 38649 | посмотрим, много ли ты ошибок наделал в ... low">http://archive- | |
second 15 1073083-1111731, 38649 | посмотрим, много ли ты ошибок наделал в ... low">http://archive- | |
- 1111732-1111755, 24 | ipq-co.narod.ru/,но</a | |
first 16 1111756-1150856, 39101 | > вот этот сайт не пашет <a href="http:/ ... nbsp;</span></em></s | |
- 1150857-1150871, 15 | ipq-co.narod.ru | |
second 16 1150872-1189972, 39101 | > вот этот сайт не пашет <a href="http:/ ... nbsp;</span></em></s | |
first 17 1189973-1226896, 36924 | pan></div><input type="checkbox" name="d ... ost"><tbody><tr><td | |
second 17 1226897-1263820, 36924 | pan></div><input type="checkbox" name="d ... ost"><tbody><tr><td | |
first 18 1263821-1301313, 37493 | class="reply" id="285792"><div id="pim14 ... <tbody><tr><td class | |
second 18 1301314-1338806, 37493 | class="reply" id="285792"><div id="pim14 ... <tbody><tr><td class | |
- 1338807-1338827, 21 | ="reply" id="285852"> | |
first 19 1338828-1376594, 37767 | <div id="pim143367214" class="postInfoM ... ttime">Птн 07 Июн 20 | |
- 1376595-1376618, 24 | ="reply" id="285852"> | |
second 19 1376619-1414385, 37767 | <div id="pim143367214" class="postInfoM ... ttime">Птн 07 Июн 20 | |
first 20 1414386-1452090, 37705 | 13 21:01:37 </span><span class="ref ... ном месте. Про понят | |
second 20 1452091-1489795, 37705 | 13 21:01:37 </span><span class="ref ... ном месте. Про понят | |
- 1489796-1489849, 54 | ливость запомню.<br><span class="unkfunc | |
first 21 1489850-1528719, 38870 | ">>Надо ставить скобки так:</span><br ... cript:addAdminMenu(t | |
- 1528720-1528779, 60 | ливость запомню.<br /><span class=" unkfunc"=" | |
second 21 1528780-1567649, 38870 | ">>Надо ставить скобки так:</span><br ... cript:addAdminMenu(t | |
- 1567650-1567668, 19 | his); return false; | |
first 22 1567669-1605551, 37883 | " onmouseout="javascript:removeAdminMenu ... play:none" onclick=" | |
- 1605552-1605577, 26 | his);" return="" false;"=" | |
second 22 1605578-1643460, 37883 | " onmouseout="javascript:removeAdminMenu ... play:none" onclick=" | |
- 1643461-1643480, 20 | javascript:addAdminM | |
first 23 1643481-1681182, 37702 | enu(this); return false;" onmouseout="ja ... 6356"><span class="f | |
- 1681183-1681204, 22 | " javascript:addadminm | |
second 23 1681205-1718906, 37702 | enu(this); return false;" onmouseout="ja ... 6356"><span class="f | |
first 24 1718907-1759029, 40123 | iletitle"></span> <span class="post ... 214" class="postInfo | |
second 24 1759030-1799152, 40123 | iletitle"></span> <span class="post ... 214" class="postInfo | |
- 1799153-1799153, 1 | M | |
first 25 1799154-1837679, 38526 | mobile"><span class="nameBlock"><span c ... ox" name="delete" cl | |
- 1837680-1837680, 1 | m | |
second 25 1837681-1876206, 38526 | mobile"><span class="nameBlock"><span c ... ox" name="delete" cl | |
- 1876207-1876220, 14 | ass="turnmeoff | |
first 26 1876221-1913117, 36897 | " value="286625"><span class="filetitle" ... /res/280501.html#286 | |
- 1913118-1913135, 18 | ass=" turnmeoff"=" | |
second 26 1913136-1950032, 36897 | " value="286625"><span class="filetitle" ... /res/280501.html#286 | |
first 27 1950033-1987385, 37353 | 836">№</a><a href="javascript:insert('>> ... <tr><td class="reply | |
second 27 1987386-2024738, 37353 | 836">№</a><a href="javascript:insert('>> ... <tr><td class="reply | |
- 2024739-2024750, 12 | " id="287436 | |
first 28 2024751-2062560, 37810 | "><div id="pim143367214" class="postInfo ... 17:15:27 </spa | |
second 28 2062561-2100370, 37810 | "><div id="pim143367214" class="postInfo ... 17:15:27 </spa | |
first 29 2100371-2139690, 39320 | n><span class="reflink"><a href="http:// ... ml</a><br><span clas | |
second 29 2139691-2179010, 39320 | n><span class="reflink"><a href="http:// ... ml</a><br><span clas | |
- 2179011-2179020, 10 | s="unkfunc | |
first 30 2179021-2218629, 39609 | ">>шаблонизатор</span><br>import re<b ... mouseout="javascript | |
- 2218630-2218643, 14 | s=" unkfunc"=" | |
second 30 2218644-2258252, 39609 | ">>шаблонизатор</span><br>import re<b ... mouseout="javascript | |
- 2258253-2258292, 40 | :removeAdminMenu(event); return false;"> | |
first 31 2258293-2295717, 37425 | </a></span> </span><br class="turnm ... ; return false;">288 | |
- 2295718-2295760, 43 | :removeAdminMenu(event); return false;"> | |
second 31 2295761-2333185, 37425 | </a></span> </span><br class="turnm ... ; return false;">288 | |
- 2333186-2333190, 5 | 198</ | |
first 32 2333191-2369977, 36787 | a><br><span class="postpanel"><a class=" ... ass="reflink1"><a hr | |
- 2369978-2369982, 5 | 198< | |
second 32 2369983-2406769, 36787 | a><br><span class="postpanel"><a class=" ... ass="reflink1"><a hr | |
- 2406770-2406794, 25 | ef="http://2ch.pm/pr/res/ | |
first 33 2406795-2444270, 37476 | 280501.html#288346">№</a><a href="javasc ... <em><span class="ref | |
- 2444271-2444280, 10 | =" pr res | |
second 33 2444281-2481756, 37476 | 280501.html#288346">№</a><a href="javasc ... <em><span class="ref | |
- 2481757-2504614, 22858 | link1"><a href="http://2ch.pm/pr/res/280 ... " id="boardNavBottom | |
second 1 2504615-2511479, 6865 | "> <span class="nowrap">Тематика [< ... /a>]</span> </div> < | |
- 2511480-2514266, 2787 | hr> <p class="footer"> - <a href ... res/280501.html -->\n | |
/tmp/test/pr-thread-15-gcache.html | |
Total repeats: 861266 of 1763495 bytes | |
- 0- 11108, 11109 | <!DOCTYPE html>\n<meta http-equiv="Conten ... "rmenu" id="boardNav | |
first 1 11109- 18340, 7232 | "> <span class="nowrap">Тематика [< ... nbsp; </div> < | |
- 18341- 38956, 20616 | /div></div> <div class="mobile" id="boar ... nt); return false;"> | |
first 2 38957- 76952, 37996 | </a></span> </span><br class="turnm ... пеешь подготовиться. | |
- 76953- 77040, 88 | (this); return false;" onmouseout="javas ... ; return false;"> | |
second 2 77041-115036, 37996 | </a></span> </span><br class="turnm ... пеешь подготовиться. | |
first 3 115037-151035, 35999 | <br><br>Вот тебе пример талицы чтобы пот ... 345599">№</a><a href | |
second 3 151036-187034, 35999 | <br><br>Вот тебе пример талицы чтобы пот ... 345599">№</a><a href | |
- 187035-187067, 33 | ="javascript:insert('>>345599')"> | |
first 4 187068-226599, 39532 | 345599</a><span class="postpanel"><a cla ... ="dateTime postNum"> | |
- 226600-226641, 42 | ="javascript:insert('>>345599')"> | |
second 4 226642-266173, 39532 | 345599</a><span class="postpanel"><a cla ... ="dateTime postNum"> | |
first 5 266174-304765, 38592 | Срд 25 Дек 2013 22:15:01<br><em><span cl ... орием ты связан<br>g | |
second 5 304766-343357, 38592 | Срд 25 Дек 2013 22:15:01<br><em><span cl ... орием ты связан<br>g | |
first 6 343358-381945, 38588 | it config -l — показывает конфиг гита, в ... time">Чтв 26 Дек 201 | |
second 6 381946-420533, 38588 | it config -l — показывает конфиг гита, в ... time">Чтв 26 Дек 201 | |
- 420534-420551, 18 | 3 21:39:18 </ | |
first 7 420552-460716, 40165 | span><span class="reflink"><a href="http ... br><em><span class=" | |
- 460717-460735, 19 | 3" 21:39:18 < | |
second 7 460736-500900, 40165 | span><span class="reflink"><a href="http ... br><em><span class=" | |
first 8 500901-541421, 40521 | reflink1"><a href="http://2ch.hk/pr/res/ ... a onmouseover="showP | |
- 541422-541423, 2 | " | |
second 8 541424-581944, 40521 | reflink1"><a href="http://2ch.hk/pr/res/ ... a onmouseover="showP | |
first 9 581945-622465, 40521 | ostPreview(event)" onmouseout="delPostPr ... nmeoff"><a id="34663 | |
second 9 622466-662986, 40521 | ostPreview(event)" onmouseout="delPostPr ... nmeoff"><a id="34663 | |
first 10 662987-701597, 38611 | 8"></a><blockquote id="m346638" class="p ... dQuickReply('346808' | |
second 10 701598-740208, 38611 | 8"></a><blockquote id="m346638" class="p ... dQuickReply('346808' | |
first 11 740209-780175, 39967 | ); return false;">346808</a><br><span cl ... " id="346972"><div i | |
second 11 780176-820142, 39967 | ); return false;">346808</a><br><span cl ... " id="346972"><div i | |
- 820143-820184, 42 | d="pim143367214" class="postInfoM mobile"> | |
first 12 820185-861270, 41086 | <span class="nameBlock"><span class="nam ... ECIMAL, как проверит | |
- 861271-861315, 45 | d="pim143367214" class="postInfoM mobile"> | |
second 12 861316-902401, 41086 | <span class="nameBlock"><span class="nam ... ECIMAL, как проверит | |
- 902402-902616, 215 | ь равно ли поле NULL, транзакции (BEGIN, ... ://www.nostarch.com/ | |
first 13 902617-943194, 40578 | mg_databases.htm" rel="nofollow">http:// ... onmouseout="delPost | |
- 943195-943415, 221 | ь равно ли поле NULL, транзакции (BEGIN, ... p: www.nostarch.com | |
second 13 943416-983993, 40578 | mg_databases.htm" rel="nofollow">http:// ... onmouseout="delPost | |
- 983994-984084, 91 | Preview(event)" href="http://2ch.hk/pr/r ... "highlight(347110)"> | |
first 14 984085-1023132, 39048 | >>347110</a></p></blockquote></td> ... звестен. Ты же сам п | |
- 1023133-1023213, 81 | Preview(event)" href="/pr/res/345388.htm ... ghlight(347110)"> | |
second 14 1023214-1062261, 39048 | >>347110</a></p></blockquote></td> ... звестен. Ты же сам п | |
- 1062262-1062511, 250 | ишешь в статье, что хочешь читать файлы ... br><br><span class=" | |
first 15 1062512-1101582, 39071 | unkfunc">> Таково пехапе, ничего не п ... /table><table id="po | |
- 1101583-1101837, 255 | ишешь в статье, что хочешь читать файлы ... <br /><span class=" | |
second 15 1101838-1140908, 39071 | unkfunc">> Таково пехапе, ничего не п ... /table><table id="po | |
first 16 1140909-1179206, 38298 | st_347440" class="post"><tbody><tr><td c ... d="347475"></a><bloc | |
second 16 1179207-1217504, 38298 | st_347440" class="post"><tbody><tr><td c ... d="347475"></a><bloc | |
- 1217505-1217515, 11 | kquote id=" | |
first 17 1217516-1256372, 38857 | m347475" class="postMessage"><p>Всё прин ... ascript:insert('>>34 | |
- 1256373-1256384, 12 | kquote id=" | |
second 17 1256385-1295241, 38857 | m347475" class="postMessage"><p>Всё прин ... ascript:insert('>>34 | |
first 18 1295242-1334114, 38873 | 7633')" onclick="javascript:addQuickRepl ... anel"><a class="post | |
second 18 1334115-1372987, 38873 | 7633')" onclick="javascript:addQuickRepl ... anel"><a class="post | |
- 1372988-1373034, 47 | btn_rep" href="http://2ch.hk/pr/res/345388.html | |
first 19 1373035-1411076, 38042 | #" onclick="javascript:addQuickReply('34 ... 444</a><br><span cla | |
- 1411077-1411091, 15 | btn_rep" href=" | |
second 19 1411092-1449133, 38042 | #" onclick="javascript:addQuickReply('34 ... 444</a><br><span cla | |
- 1449134-1449137, 4 | ss=" | |
first 20 1449138-1486392, 37255 | unkfunc">>Если есть вопросы, задавай, ... ><span class="subjec | |
- 1486393-1486397, 5 | ss=" | |
second 20 1486398-1523652, 37255 | unkfunc">>Если есть вопросы, задавай, ... ><span class="subjec | |
first 21 1523653-1561122, 37470 | t"></span></span><span data-utc="1339778 ... ttp://2ch.hk/pr/res/ | |
second 21 1561123-1598592, 37470 | t"></span></span><span data-utc="1339778 ... ttp://2ch.hk/pr/res/ | |
first 22 1598593-1635792, 37200 | 345388.html#348611">№</a><a href="javasc ... ta-utc="1339778953" | |
- 1635793-1635799, 7 | pr res | |
second 22 1635800-1672999, 37200 | 345388.html#348611">№</a><a href="javasc ... ta-utc="1339778953" | |
- 1673000-1673020, 21 | class="dateTime postN | |
first 23 1673021-1710784, 37764 | um">Суб 04 Янв 2014 18:56:14<br><em><spa ... seover="showPostPrev | |
- 1710785-1710806, 22 | class=" datetime postn | |
second 23 1710807-1748570, 37764 | um">Суб 04 Янв 2014 18:56:14<br><em><spa ... seover="showPostPrev | |
- 1748571-1754002, 5432 | iew(event)" onmouseout="delPostPreview(e ... " id="boardNavBottom | |
second 1 1754003-1761234, 7232 | "> <span class="nowrap">Тематика [< ... nbsp; </div> < | |
- 1761235-1763494, 2260 | hr> <p class="footer"> - <a href ... channel=suggest -->\n | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Ищет в HTML коде повторяющиеся куски | |
*/ | |
// Минимальная длина повторяющегося куска | |
$minSize = 1000; | |
// Шаг поиска, в 2 р меньше. Мы разбиваем исходную строку на | |
// подстроки с таким шагом, берем каждую по очереди и ищем | |
// справа ее повторы. | |
$sliceSize = (int)max(1, ceil($minSize / 2)); // шаг поиска, в 2 р меньше | |
// Выдать на stdout исправленный файл | |
$doFix = in_array('--fix', $argv); | |
$stderr = fopen('php://stderr', 'w'); | |
// Минимальный размер повторяющегося куска, подлежащего вырезанию. | |
// Если поставить маленьким, то можно вырезать например длинный пост из | |
// тысяч слов sage или меню, которое продублировано сверху и снизу. | |
$copyMinSize = 30000; | |
// Максимальное расстояние между концом первой копии и началом второй. Этот | |
// промежуток также вырезается. | |
$spaceMaxSize = 500; | |
$input = file_get_contents('php://stdin'); | |
// Общее число дублирующихся байт | |
$totalRepeat = 0; | |
$pos = 0; | |
$copyNumber = 1; | |
// Найденные объекты Copy и Segment | |
$copies = []; | |
$segments = []; | |
// $lastMsg = 0; | |
/* | |
Разбиваем строку на куски длиной sliceSize и для | |
каждого ищем повторения справа от него. | |
*/ | |
while ($pos + $minSize < strlen($input)) { | |
// if ($pos - $lastMsg > 50000) { | |
// printf("Offset: %d\n", $pos); | |
// $lastMsg = $pos; | |
// } | |
$sample = substr($input, $pos, $sliceSize); | |
$searchFrom = $pos + $sliceSize; | |
// Возможная точка в строке, где повторяется наш кусочек | |
$copyPos = strpos($input, $sample, $searchFrom); | |
if ($copyPos === false) { | |
$pos += $sliceSize; | |
continue; | |
} | |
// Находим длину повторяющегося сегмента | |
list($start1, $start2, $length) = determineRepeatLength($input, $pos, $copyPos, $minSize); | |
assert($length >= $sliceSize); | |
if ($length < $minSize) { | |
$pos += $sliceSize; | |
continue; | |
} | |
$first = new Segment($input, $start1, $length, 'first', $copyNumber); | |
$second = new Segment($input, $start2, $length, 'second', $copyNumber); | |
$copy = new Copy($first, $second); | |
$copies[] = $copy; | |
$segments[] = $first; | |
$segments[] = $second; | |
$copyNumber++; | |
$totalRepeat += $length; | |
$pos = $start1 + $length; | |
} | |
fprintf($stderr, "Total repeats: %d of %d bytes\n", $totalRepeat, strlen($input)); | |
// Сортируем сегменты по возрастанию смещения от начала файла | |
usort($segments, function ($a, $b) { | |
return $a->offset - $b->offset; | |
}); | |
// Выводим карту файла, с повторяющимися сегментами | |
$pos = 0; | |
foreach ($segments as $seg) { | |
if ($seg->offset > $pos) { | |
$free = new Segment($input, $pos, $seg->offset - $pos, '-'); | |
printSegment($free); | |
$pos = $seg->offset; | |
} | |
printSegment($seg); | |
$pos = $seg->getEnd() + 1; | |
} | |
if ($pos < strlen($input)) { | |
$free = new Segment($input, $pos, strlen($input) - $pos, '-'); | |
printSegment($free); | |
} | |
if ($doFix) { | |
/* | |
Находим все копии, подходящие по размеру, и вырезаем из | |
них второй сегмент и промежуток между 1-м и 2-м сегментами. | |
*/ | |
$removeSegments = []; | |
$removeBytes = 0; | |
// Выбираем список сегментов для вырезания | |
foreach ($copies as $copy) { | |
$seg = $copy->first; | |
if ($seg->length < $copyMinSize) { | |
fprintf($stderr, "Skip seg {$seg->copyNumber}, size = {$seg->length}\n"); | |
continue; | |
} | |
$spacing = $copy->getSpacing(); | |
if ($spacing > $spaceMaxSize) { | |
fprintf($stderr, "Skip seg {$seg->copyNumber}, spacing = {$copy->getSpacing()}\n"); | |
continue; | |
} | |
// Вырезаем также промежуток между копиями | |
fprintf($stderr, "Remove second seg {$seg->copyNumber} + spacing ({$copy->getSpacing()} bytes)\n"); | |
if ($copy->getSpacing() > 0) { | |
$spacingSeg = new Segment($input, $seg->getEnd() + 1, $copy->getSpacing(), 'space', $seg->copyNumber); | |
$removeSegments[] = $spacingSeg; | |
} | |
$removeSegments[] = $copy->second; | |
} | |
fprintf($stderr, "Remove segments:\n"); | |
$newParts = []; | |
$start = 0; | |
// Пересоздаем файл без вырезанных сегментов | |
foreach ($removeSegments as $seg) { | |
$removeBytes += $seg->length; | |
if ($seg->offset > $start) { | |
$part = substr($input, $start, $seg->offset - $start); | |
$newParts[] = $part; | |
} | |
$start = $seg->getEnd() + 1; | |
printSegment($seg); | |
} | |
if ($start < strlen($input)) { | |
$part = substr($input, $start); | |
$newParts[] = $part; | |
} | |
// Собираем результат | |
$result = implode("", $newParts); | |
fprintf( | |
$stderr, | |
"Left %d bytes of %d source, removed %d bytes, expected to remove %d bytes\n", | |
strlen($result), | |
strlen($input), | |
strlen($input) - strlen($result), | |
$removeBytes | |
); | |
echo $result; | |
} | |
function printSegment(Segment $seg) | |
{ | |
global $stderr; | |
$content = truncate($seg->getContent(), 60); | |
$content = strtr($content, [ | |
"\r" => "\\r", | |
"\n" => "\\n", | |
"\t" => "\\t" | |
]); | |
fprintf( | |
$stderr, | |
"%6s %2s %6d-%6d,%6d | %s\n", | |
$seg->type, | |
$seg->copyNumber, | |
$seg->offset, | |
$seg->getEnd(), | |
$seg->length, | |
$content | |
); | |
} | |
/** | |
* Ищет одинаковые куски строки, начиная с данной позиции. | |
* | |
* Получает на вход 2 позиции в строке. Ищет вправо и влево от них | |
* до тех пор, пока там идут одинаковые символы. | |
* | |
* Возвращает начало первого, второго повторяющихся кусков и их длину, | |
* все в байтах. | |
* | |
* @return [$start1, $start2, $length] | |
*/ | |
function determineRepeatLength($input, $pos, $copyPos, $minSize) | |
{ | |
$i = $pos; | |
$j = $copyPos; | |
$len = strlen($input); | |
$right = 0; | |
while ($i < $len && $j < $len) { | |
if ($input[$i] !== $input[$j]) { | |
break; | |
} | |
$right++; | |
$i++; | |
$j++; | |
} | |
$left = 0; | |
$i = $pos; | |
$j = $copyPos; | |
while ($i > 1 && $j > 1) { | |
$i--; | |
$j--; | |
if ($input[$i] !== $input[$j]) { | |
break; | |
} | |
$left++; | |
} | |
$start1 = $pos - $left; | |
$start2 = $copyPos - $left; | |
$length = $left + $right; | |
return [$start1, $start2, $length]; | |
} | |
/** | |
* Выводит длинную строку с многоточием посередине. | |
*/ | |
function truncate($string, $length) | |
{ | |
if (mb_strlen($string) < $length) { | |
return $string; | |
} | |
$break = ceil($length * 0.66); | |
$tail = floor($length * 0.34); | |
return mb_substr($string, 0, $break) . ' ... ' . | |
mb_substr($string, -$tail); | |
} | |
/** | |
* Представляет кусок исходной строки с HTML-кодом, определяемый | |
* смещением относительно начала в байтах (offset) и длиной в | |
* байтах (length). | |
*/ | |
class Segment | |
{ | |
public $from; | |
public $offset; | |
public $input; | |
public $type; | |
public $copyNumber; | |
public function __construct($input, $offset, $length, $type, $copyNumber = null) | |
{ | |
$this->input = $input; | |
$this->offset = $offset; | |
$this->length = $length; | |
$this->type = $type; | |
$this->copyNumber = $copyNumber; | |
} | |
public function getContent() | |
{ | |
return substr($this->input, $this->offset, $this->length); | |
} | |
public function getBefore($length) | |
{ | |
$from = max(0, $this->offset - $length); | |
return substr($this->input, $from, $length); | |
} | |
public function getAfter($length) | |
{ | |
$from = $this->offset + $length; | |
return substr($this->input, $from, $length); | |
} | |
public function getEnd() | |
{ | |
return $this->offset + $this->length - 1; | |
} | |
} | |
/** | |
* Представляет 2 сегмента, являющиеся дубликатами. spacing - число | |
* байт между концом первого сегмента и началом второго. | |
*/ | |
class Copy | |
{ | |
public $first; | |
public $second; | |
public function __construct(Segment $first, Segment $second) | |
{ | |
$this->first = $first; | |
$this->second = $second; | |
} | |
public function getSpacing() | |
{ | |
return $this->second->offset - ($this->first->getEnd() + 1); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment