parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

нет

Misha v.3 03.07.2008 14:38 / 03.07.2008 14:50

UPDATE: а-а-а, тупил. действительно, скорее всего большой кучи записей в хеше не будет, по причине одинаковости большинства тегов, поэтому дальше можно не читать %-)


вы заменяете каждый тег (в примере это каждый <p> и каждый </p>) на уникальный md5. я предлагаю заменять на одинаковую уникальную строку (тоже может быть md5, но один для всех замен, а не 500 разных).

выкушенное класть в таблицу (номер строки в таблице == номер позиции тега в исходном тексте) или хеш (ключ к хеше == номер позиции тега в исходном тексте, или религия запрещает добавить counter в случае с hash?).

на чем теоретически имеем экономию я уже писал (минус 499 вычислений md5 и минус 499 вызовов match для обратной вставки тегов в случае вашего кода или 1 простой match вместо 1 replace с таблицей замен в 500 строк в случае кода Eugene)

сколько это будет в попугаях практически -- надо смотреть, но я уверен, что будет быстрее и с меньшим расходом памяти.
@textPreprocess[text][hTag;iPos;sMarker]
$result[$text]
^if(^result.pos[<] >= 0 || ^result.pos[>] >= 0){
	^if(!def $tRepl)
		$tRepl[^table::create{from	to^#0A<	&lt^;^#0A>	&gt^;}]
	}
	$sMarker[/*^math:md5[^math:uuid[]]*/]
	$hTag[^hash::create[]]
	$iPos(0)
	$result[^result.match[(</?(?=[a-z])[^^>]+>)][gi]{${sMarker}$hTag.[$iPos][$match.1]$iPos($iPos+1)}]
	$result[^result.replace[$tRepl]]
	^if($hTag){
		$iPos(0)
		$result[^result.match[^taint[regex][$sMarker]][g]{${hTag.$iPos}$iPos($iPos+1)}]
	}
}
### End @textPreprocess