Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: preg_replace() сбрасывает соединение
Форумы портала PHP.SU » » Вопросы новичков » preg_replace() сбрасывает соединение

Страниц (1): [1]
 

1. ugin_root - 31 Января, 2012 - 05:28:40 - перейти к сообщению
итак есть задача сделать таблички на "форум", кому-то очень понравились таблички как в вики и решено было делать их. Итак код работает, но регулярка сбрасывает соединение когда в этой "табличке" много записей

PHP:
скопировать код в буфер обмена
  1. function tableTr($s){
  2.         return '<tr>'.preg_replace(
  3.                 '/([\|\^]?)(?<=([\|\^]))([^\|\^]+)([\|\^]+)/Usie',
  4.                
  5.                 "'<'.(substr('$1$2',0,1)=='|'?'td':'th').(strlen('$4')===1?'':' colspan=\"'.strlen('$4').'\"').'>
  6.                         $3
  7.                 </'.(substr('$1$2',0,1)=='|'?'td':'th').'>'",$s[2]).'</tr>';
  8. }
  9. $str = "
  10. ^Заголовок1^Заголовок2^Заголовок3^
  11. |ячейка1|ячейка2|ячейка3|
  12.  
  13. ";
  14. $str=preg_replace('/(?<=[^\|\^][\n\r]|^)([|^](([^\r\n]|[|^][\r\n]+[|^])*)[|^])(?=[\n\r]+[^\|\^]|$)/usi','<table>$1</table>',$str);
  15. $str=preg_replace_callback('/(?<=[\n\r]|(\<table\>))([\|\^][^\r\n]+[\|\^])(?=[\r\n]|(\<\/table\>))/usi',"tableTr",$str);
  16. echo $str;
  17.  

и этот код выполняется! но если повторить строку "|ячейка1|ячейка2|ячейка3|" скажем 100 раз то например хром выдаёт вот такую строчку:
Ошибка 101 (net::ERR_CONNECTION_RESET): Соединение сброшено.

т.е. у меня проблема с большими таблицами. облазил весь гугл, ничего похожего найти не смог, может кто-то сталкивался?

в коде используется preg_replace_callback, но если сделать тоже самое в preg_replace с модификатором 'e' проблема остаётся

з.ы. файл сохранять в utf-8 иначе ячейки на русском станут пустыми.
2. snikers987 - 31 Января, 2012 - 08:57:29 - перейти к сообщению
ничего регулярка не сбрасывает, скорее всего это таймаут соединения из-за продолжительной работы скрипта.
3. ugin_root - 31 Января, 2012 - 09:40:43 - перейти к сообщению
и в правду, на сервере всё работатет.... а на локале если делаю 20 записей сбрасывает, непонятно в чём дело, хотя скажем цикл(1000) с десятью записями обрабатывается мгоновенно.
4. Infelix - 31 Января, 2012 - 09:43:31 - перейти к сообщению
потому что работа со строкам (а особенно с регулярками) намного более ресурсоемкая чем прогон 1000 итераций цикла
5. ugin_root - 31 Января, 2012 - 09:57:58 - перейти к сообщению
Infelix
если учесть что сервер от моего компа отличается тем что на нём freeBSD которая стоит там с 2002 года, там третий пень а не i3 как у меня и 2 гига оперативы против моих 8... То дело точно не в производительности.

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. function tableTr($s){
  4.         return '<tr>'.preg_replace('/([\|\^]?)(?<=([\|\^]))([^\|\^]+)([\|\^]+)/Usie',"'<'.(substr('$1$2',0,1)=='|'?'td':'th').(strlen('$4')===1?'':' colspan=\"'.strlen('$4').'\"').'>$3</'.(substr('$1$2',0,1)=='|'?'td':'th').'>'",$s[2]).'</tr>';
  5. }
  6. $str = "
  7.  
  8. ^Заголовок1^Заголовок2^Заголовок3^
  9. |ячейка1|ячейка2|ячейка3|
  10. |ячейка1|ячейка2|ячейка3|
  11. |ячейка1|ячейка2|ячейка3|
  12. |ячейка1|ячейка2|ячейка3|
  13. |ячейка1|ячейка2|ячейка3|
  14. |ячейка1|ячейка2|ячейка3|
  15. |ячейка1|ячейка2|ячейка3|
  16. |ячейка1|ячейка2|ячейка3|
  17. |ячейка1|ячейка2|ячейка3|
  18. |ячейка1|ячейка2|ячейка3|
  19. |ячейка1|ячейка2|ячейка3|
  20. |ячейка1|ячейка2|ячейка3|
  21.  
  22. ";
  23. function GetTime(){$m=explode(' ',microtime());return $m[1]+$m[0];}
  24. $tstart = GetTime();
  25. $str=preg_replace('/(?<=[^\|\^][\n\r]|^)([|^](([^\r\n]|[|^][\r\n]+[|^])*)[|^])(?=[\n\r]+[^\|\^]|$)/usi','<table>$1</table>',$str);
  26. $str=preg_replace_callback('/(?<=[\n\r]|(\<table\>))([\|\^][^\r\n]+[\|\^])(?=[\r\n]|(\<\/table\>))/usi',"tableTr",$str);
  27.  
  28. echo $str;
  29.  
  30. echo 'Время выполнения: ' . (GetTime() - $tstart) . ' сек.';


CODE (text):
скопировать код в буфер обмена
  1.  
  2.  
  3. <table><tr><th>Заголовок1</th><th>Заголовок2</th><th>Заголовок3</th></tr>
  4. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr>
  5. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr>
  6. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr>
  7. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr>
  8. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr>
  9. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr>
  10. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr>
  11. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr>
  12. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr>
  13. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr>
  14. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr>
  15. <tr><td>ячейка1</td><td>ячейка2</td><td>ячейка3</td></tr></table>
  16.  
  17. Время выполнения: 0.0019629001617432 сек.


если добавляю ещё одну строку то соединение сбрасывается на локальном компе... странно

 

Powered by ExBB FM 1.0 RC1