2010-05-27 2 views
0

У меня смешанный html, настраиваемый код и обычный текст Мне нужно часто изучать и изменять часто на нескольких длинных страницах вики. Я работаю с проприетарным вики-подобным приложением и не могу контролировать, как приложение функционирует или проверяет ввод пользователя. Макет страниц, которые пользователи добавляют, должен соответствовать очень конкретному стандарту и всегда включать очень специфический текст только в определенных местах - стандарт, который часто изменяется. Если пользователи добавляют страницы, которые не соответствуют стандарту, они будут удалены.Preg_replace regex, новые строки, сброс соединения

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

Я создал API на основе PHP, чтобы автоматизировать этот пост-валидацию и частой процесс restandardization для меня. Я смог настроить шаблоны регулярных выражений для обработки всего этого смешанного текста, и все они отлично работают для обработки отдельных строк. Проблема заключается в следующем: плохо сформированное регулярное выражение для длинного текста с разрывами строк может привести к неожиданным результатам, таким как сбрасывание соединения. У меня нет доступа к журналам на стороне сервера для устранения неполадок. Как мне это преодолеть?

Это только один пример того, что у меня есть: {column} и {section} теги, которые я ищу ниже, могут иметь любое количество атрибутов и обернуть любой текст. {section} может быть или не существовать и может быть или не быть одной или несколькими строками в столбце {column}, но ее необходимо обернуть внутри {column}. {column} сам может или не может существовать, и если это не так, мне все равно, поскольку у меня тогда есть текст по умолчанию, вставленный позже в сценарий. Я хочу захватить содержимое внутреннего раздела и обернуть его в тег div html. Я не могу вспомнить точную картину я использую экспромтом на данный момент, но это достаточно близко ...

 
$pattern = "/\{column:id=summary([|]?([a-zA-Z0-9-_ ]+[:][a-zA-Z0-9-_ ]+[ ]?))\}(.*)({section([|]([a-zA-Z0-9-_ ]+[:][a-zA-Z0-9-_ ]+[ ]?))\}(.*)\{section\}(.*))?{column\}/s"; 
$replacement = "{html}<div id='summary'>$7</div>{html}"; 
$text = preg_replace($pattern, $replacement, $subject); 

Обработка {столбец} и {раздел} атрибутов и переходя только действительные параметры HTML для нового html div или его подтекст сам по себе является проблемой, но теперь моя главная задача - получить значение (. *) в {section} выше, не вызывая сброса соединения. Любые указатели?

ответ

1

Возможно, это не то, что вы ищете, но: не используйте регулярное выражение! Вы пытаетесь разобрать очень структурированный, очень сложный текст, и для этого вам действительно нужно использовать парсер. Я не знаю, что доступно для PHP (вы можете использовать Google так же хорошо, как и я, и я не вправе делать какие-либо конкретные рекомендации), но я уверен, что что-то существует.

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

1

Я нашел вероятный источник проблемы с аварийной ситуацией: катастрофическое обратное отслеживание (http://www.regular-expressions.info/catastrophic.html). Поэтому, если усовершенствовать шаблоны для обработки, которые не работают (и если у кого-то есть какие-либо шаблоны, предлагаемые, пожалуйста, разделите их), лучше всего перейти на другое решение для анализа текста.

1

Единственная реальная проблема, которую я вижу, - все это (.*) s. В режиме /s каждый (.*) изначально заламывает всю страницу, только чтобы отступить в основном. Измените их все на (.*?) (т. Е. Переключитесь на неохотные кванторы), и он должен работать намного быстрее.

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