Является ли использование регулярных выражений для обработчика запросов в PHP плохо? - PullRequest
2 голосов
/ 23 января 2011

Я работаю над обработчиком запросов для маршрутизации каждого вызова страницы через мою индексную страницу и получения URL, дружественных для SEO.

domain.com / account / settings

это будет легко сопоставить с правильной страницей, но некоторые будут более сложными, когда в URI станет идентификационный номер или номер страницы.

Итак, я вижу, что некоторые люди будут использовать такие вещи, как preg_match и циклически проходить по массиву шаблонов -> uri, чтобы получить совпадение, которое хорошо подходит, когда в игру вступают пейджинг и id, но из моего опыта это похоже наpreg_match для массива, скажем, 20 элементов при каждой загрузке страницы, не подходит для производительности.

Скажите, пожалуйста, свою мысль по этому поводу?

Ответы [ 4 ]

2 голосов
/ 23 января 2011

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

При необходимости вы могли бы уменьшить это число в 20 раз и менее для каждого URI с помощью нескольких простых проверок strstr (), чтобы увидеть, в каком основном формате находится URI (содержит ли он идентификатор или нет, страницуномер или нет и т. д.).Оптимизация ваших регулярных выражений, таких как использование метасимволов "start" ^ и "end" $ везде, где это возможно, также поможет.

2 голосов
/ 23 января 2011

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

Я бы использовал обработчики регулярных выражений лично. Они более гибкие, простые и легкие в обслуживании, чем некоторые другие альтернативы этой проблеме. Но YMMV ...

0 голосов
/ 23 января 2011

Итак, я вижу, что некоторые люди будут использовать вещи как preg_match и циклически массив шаблонов -> uri

Я думаю, такой подход в порядке. Например, фреймворки Drupal и Django делают именно это.

Другой альтернативой является использование механизма перезаписи URL (подробности см., Например, в этом вопросе ).

0 голосов
/ 23 января 2011

На мой сайт У меня просто есть несколько разных правил переписывания, которые, я думаю, хорошо работают:

RewriteRule ^(main|home|daily_photo_mockup|games|sporktris(?:_web)?|nangooni|contact|source|admin|edit_photos?|edit_galleries|edit_gallery)(?:_(fr|sv))?$ index.pl?page=$1&lang=$2
RewriteRule ^(snow_flakes|photography)(\d+)?(?:_p(\d+))?(?:_(fr|sv))?$ index.pl?page=$1&subpage=$2&img=$3&lang=$4
...