Preg_replace regex, переводы строки, сброс подключения - PullRequest
0 голосов
/ 28 мая 2010

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

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

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

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

$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);

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

Ответы [ 3 ]

1 голос
/ 02 июня 2010

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

1 голос
/ 02 июня 2010

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

1 голос
/ 28 мая 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...