2012-06-27 131 views
5

我一直在努力寻找实现我的系统实际上是由一个字符串演出季和剧集数相匹配的好方法,你可以在这里看到当前工作代码:https://github.com/huddy/tvfilename这是我的PHP应用程序的正确设计模式?

我目前正在重写此库,并想要一个更好的方式来实现匹配如何发生,目前基本上它的工作方式是:

有一个文件夹中有类(称为处理程序),每个处理程序是一个类,实现一个接口,以确保方法称为match();存在,此匹配方法使用存储在该处理程序类(其中有很多)的属性中存储的正则表达式来尝试匹配季节和情节。

该类加载所有这些处理程序通过实例化每个存储在属性中的数组,当我想尝试匹配某些字符串时,该方法会遍历这些调用match()的对象;然后返回true的第一个返回结果集中的季节和它匹配的情节。

我真的不喜欢这样做,这对我来说有点不好,我希望设计模式能够帮助,我的最终目标是使用最佳实践来做到这一点,我想知道我是哪一种应该使用?

存在的其他问题是:

  • 一个以上的处理器可以匹配的字符串,所以他们必须在为了防止更贪心的孩子第一个匹配的,不知道这是可解因为一些正则表达式模式必须是贪婪的,但可能是一个评分系统,它显示了匹配的正确性的百分比,但我不知道如何实际实现这一点。

  • 我不是如果实例化所有这些处理程序是一种很好的方法,速度很重要,但是使用最佳实践并坚持设计模式来创建良好的,可扩展和可维护的代码是我的最终优先事项。值得一提的处理器类有时做其他事情不仅仅是正则表达式匹配,他们有时预习的串,除去常用词等匹配

干杯任何帮助 比利

+1

您可以结帐[Horde Routes](http://dev.horde.org/routes/)。 –

+0

你在想这个。您的贪婪问题可以通过将数组从最贪婪到最贪婪的顺序轻松解决,并且您的正则表达式都可以在一个类中。我没有看到比这更直接或更干净的方法。 –

回答

2

创建一类每个正则表达式效率非常低,你在这里将数据与数据混淆。您可以将所有正则表达式存储在配置数组或单独的类或XML文件中 - 无关紧要。然后一个方法可以接受所有正则表达式,遍历它们并执行匹配。 如果一个赛季不总是匹配[1],您可以使用命名的子模式 - 可以解决这个问题。

至于你的模式问题的顺序,你可以简单地把所有模式按你喜欢的顺序 - 从最具体的模式到更一般的模式。

1

你可以修改这个pattern to implement complex case analysis到PHP。这或多或少是你一直在做的。您定义所有案例,实施一个条件,说明何时适用案件,以及当您处于案件中时如何解决问题。该模式将允许您决定如果适用多个案例(选择一个,优先于另一个,或任何您想要的),该怎么做。

我也想成为一个好主意,如果你命名你的财产以后格式更好像S01E01

SddEdd 
SnnEnn 
SDigitDigitEDigitDigit 
STwoDigitsETWoDigits 

,而不是格式1,FORMAT2。 您也可以稍微修改该模式以针对案例的条件和解决方案使用对象实例,因此您将能够使用单个类处理所有RegExps案例 new RegexpCase(“S(?:\ d {2})E(?:\ d {2})“); 以及所有其他不仅仅是用类来解决这种情况的正则表达式。

0

我认为你需要一个基于你想要的参数的模式顺序的偏好顺序。 我认为第二个答案真的很好地回答你的问题。你似乎也很好地处理了你的代码。看起来相当不错的代码

0

我个人更喜欢在这个实例中使用单独的类,你的代码库会如果你采取这种方法(即,如果你真的需要操纵字符串),它会更加灵活。如果你看看Zend如何实现Zend_Validate和Zend_Filter,他们有一个非常类似于当前实现的方法(在类上运行 - > validate()和 - > filter()属性循环)。

我会有类似这样的结构:

  • App_Tv_Match
  • App_Tv_Match_Abstract
  • App_Tv_Match_Collection
  • App_Tv_Match_SXXEXX
  • App_Tv_Match_SeasonXEpisodeX

(你的命名可能成为irritat然而,这些课程)。

然而,在抽象我会类似于这样的设置:

Abstract Class App_Tv_Match_Abstract 
{ 
    protected $_returnOnMatch = false; 
    protected $_priority  = 1; 
} 

而且我App_Tv_Match_Collection类将有匹配类注射 - 那么集合类将使用匹配类处理排序和匹配。如果Match类有“returnOnMatch”标记为true,那么如果匹配,我会停止尝试并返回这个(即非贪婪的),但是如果没有returnOnMatch类匹配,那么我会返回具有最高优先级的使用排序或集合类中的简单循环)。

相关问题