在PHP中使用正则表达式处理请求处理程序不好吗?

时间:2011-01-23 03:20:03

标签: php regex performance requesthandler

我正在处理一个请求处理程序,通过我的索引页面路由每个页面调用并拥有SEO友好的URL。

domain.com/account/settings

这很容易映射到正确的页面,但是当uri中出现ID号或页码时,有些更复杂。

所以我看到有些人会使用像preg_match这样的东西并循环遍历一系列模式 - > uri得到一个很好的匹配,当分页和id发挥作用时,但根据我的经验,似乎在每个页面加载的20个项目的数组上运行preg_match不利于性能。

请告诉我你对此的看法?

4 个答案:

答案 0 :(得分:2)

这是你应该关注的事情:什么是更好的选择,而不是这个看起来很糟糕。如果你有一个似乎更好的替代品,他们会使用它。如果没有,请使用正则表达式解决方案,直到您知道您需要加快速度(我将忽略我对通常的过早优化的咆哮)。

我会亲自使用正则表达式处理程序。与此问题的其他替代方案相比,它们更灵活,更容易,更易于维护。但YMMV ......

答案 1 :(得分:2)

字符串上的一个非常复杂的正则表达式与URI一样短,只需要很少的时间,甚至可以运行20次。如果你有a)profiled或定时它来证明它是一个性能问题,而b)一个很好的替代使用,那么你可以尝试改变它,但否则我不会太担心它。毕竟,大量站点执行类似于mod_rewrite的操作,在每个页面加载时针对一系列正则表达式检查页面URI。

如果需要,你可以通过一些简单的strstr()检查将每个URI减少20倍到更少,以查看URI的基本格式(无论是否包含id,是否包含页码)等)。优化您的正则表达式,例如尽可能使用“开始”^和“结束”$元字符也会有所帮助。

答案 2 :(得分:0)

my site我只有一些不同的重写规则,我觉得这很有效:

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

答案 3 :(得分:0)

  

所以我看到有些人会用东西   像preg_match和循环通过   模式数组 - > URI

我认为,这种方法还可以。例如,Drupal和Django框架就是这样做的。

另一种选择是使用URL重写引擎(例如,请参阅this question)。