2011-01-19 3 views
1

У меня есть HTML-страница 40 КБ, и я хочу найти в ней определенные шаблоны.Найти шаблоны в длинной строке?

Я могу прочитать его буфером 1K, но я хочу избежать ситуации, что шаблон, который я ищу, будет разделен между двумя буферами.

Как преодолеть эту проблему?

ответ

3

Это очень просто. Вы считаете самый длинный шаблон, который вы будете искать, затем либо отскакиваете указатель файла на эту сумму, либо прокручиваете файл, читая только дельту.

Представьте, что самый длинный шаблон составляет 26 байт.

  1. Прочитано 1к.
  2. Проверьте все рисунки -> ничего.
  3. Капля 1k - 26 байт из буфера.
  4. Читать 1k - 26 байт из потока и добавить в буфер
  5. Goto 2.

Edit: Позвольте мне уточнить: Есть два способа сделать это, оба имеют свои достоинства. Тот, который я документировал выше, лучше всего использовать, если вы читаете из потока, что означает источник данных, который не поддерживает поиск. Если, однако, ваш источник данных поддерживает поиск (например, файл файловой системы), вы можете легко сделать то же самое с запросами. Проверьте шаблон, если он не найден, найдите размер самого длинного шаблона, затем начните с него.

Если, однако, вы хотите поддержать поиск шаблонов, длина которых превышает размер вашего буфера, вам может потребоваться гораздо более умный алгоритм. Вам понадобится таблица поиска всех шаблонов, которые в настоящее время «открываются», когда вы пытаетесь прочитать больше данных, что, в свою очередь, будет стоить больше памяти - вы получите эту проблему.

+0

Надеюсь, что его длина самой длинной строки не 1k-1 :) –

+0

Хорошая идея, но она работает только, если он ищет точные символы. Что, если шаблон - все между некоторыми тегами html. Это длина непредсказуема. –

+0

Если длина непредсказуема, я, конечно, предсказываю длину, большую, чем его размер буфера. Это означает, что у него больше проблем, чем он знает :) – 0xCAFEBABE

0

Почему бы не использовать SAX parser. Он создан для обработки больших файлов разметки. Вы можете столкнуться с проблемами, если пытаетесь сопоставить разные элементы на одном уровне. Однако это не невозможно обрабатывать

+0

SAX-синтаксический анализатор не работает, поэтому я не могу его использовать. – pixel

Смежные вопросы