Парсинг команд из пользовательского ввода - PullRequest
1 голос
/ 23 апреля 2009

Этот вопрос предназначен для обсуждения личных мнений людей при обработке пользовательского ввода.

Эта часть проекта, над которой я работаю, обрабатывает ввод пользователя аналогично IRC-чату. Например, есть заданные команды и еще много чего, для общения, выполнения действий и т. Д.

Теперь у меня есть несколько вариантов выбора для разбора этого ввода. Я мог бы использовать регулярные выражения, я мог бы разобрать его напрямую (т. Е. Большой оператор switch со всеми поддерживаемыми командами, просто проверяя первое x число символов в пользовательском вводе), или даже мог сойти с ума и добавить парсер, похожий на Flex Реализация зубров. Еще одним вариантом, который я рассматривал, было определение всех команд в файле XML, чтобы отделить их от реализации кода.

Итак, что думают сообщества?

1 Ответ

1 голос
/ 23 апреля 2009

Я бы пошел с хорошей смешанной сумкой из всех.

Очевидно, вам придется санировать ввод. Убедитесь, что там нет никаких неприятных вещей, в зависимости от того, куда будут вводиться данные для предотвращения внедрения SQL, XSS, CSRF и т. Д. *

Но когда ваш ввод чистый, вы можете использовать регулярное выражение, которое отлавливает те, которые предназначены для команды, и получает все необходимые подсовпадения (параметры команды и т. Д.), А затем имеет какой-то оператор диспетчера-переключателя или подобное.

Здесь действительно нет наилучшей практики прикрытия, за исключением того, что всегда всегда и вчетверо всегда гарантируется, что пользовательский ввод очищен. Кроме того, придерживайтесь того, что кажется наиболее подходящим для вашего случая.

Очевидно, что есть те, кто говорит, что если у вас есть проблема, и вы думаете об использовании reg exps для решения указанной проблемы, у вас есть две проблемы, но, если их использовать осторожно, они самые лучшие. Просто помните, что regexp-монстры могут очень быстро читать с очень плохой читабельностью.

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