匹配正则表达式


Matching a regex

我的正则表达式技能很差。为了让我的js/css显示正确的菜单,我在li中添加了一个"selected"类,这样js就知道哪个是当前项(这样它就可以显示下拉菜单的其余部分)。

我的问题是在codeigniter中匹配正确的uri字符串:

<li <? if((strstr($this->uri->uri_string(),"rfid_finder/finder")) || (strstr($this->uri->uri_string(),"finder"))) {?>class="selected"<?}?>  rel="home"> <?= anchor('finder','HOME')?></li>

我最初使用这种方法,但现在我的路线有点复杂,可以进行搜索和分页。

我需要一个正则表达式来匹配以下所有路由:

$route['finder/(:any)/(:any)/(:num)'] = "rfid_finder/finder/$1/$2/$3";
$route['finder/(:any)/(:any)'] = "rfid_finder/finder/$1/$2";
$route['finder/(:any)'] = "rfid_finder/finder/$1";
$route['finder'] = 'rfid_finder/finder';

但当用户访问时:

rfid_finder/search_form

第一菜单没有被赋予所选择的类。

更新

我希望第一个代码片段与路由匹配,而不是与rfid_finder/search路由匹配——我有第二行代码与rfid_finder/search_form路由匹配。我的问题在于尝试使用(strstr($this->uri->uri_string(),"finder")捕获路由,它匹配我的所有路由,甚至是rfid_finder/search_form

嗯,让我知道这是否适合你。它在我的测试中似乎有效。

preg_match('|^(rfid_finder/)?finder/?([a-z0-9]+?)?(/[a-z0-9]+?)?(/'d+?)?$|i', $string)

这是我的测试示例:

$route = array();
$route['finder/(:any)/(:any)/(:num)'] = "rfid_finder/finder/$1/$2/$3";
$route['finder/(:any)/(:any)'] = "rfid_finder/finder/$1/$2";
$route['finder/(:any)'] = "rfid_finder/finder/$1";
$route['finder'] = 'rfid_finder/finder';

$route['finder/2313'] = 'rfid_finder/finder';
$route['finder/asd/dsda'] = 'rfid_finder/finder';
$route['rfid_finder/finder/dd/122'] = 'rfid_finder/finder';
$route['rfid_finder/finder/dd/122/qwewe'] = 'rfid_finder/finder';
$route['rfid_finder/finder/dd/asdsad/333'] = 'rfid_finder/finder';
foreach ($route as $string=>$match) {
    if ( preg_match('|^(rfid_finder/)?finder/?([a-z0-9]+?)?(/[a-z0-9]+?)?(/'d+?)?$|i', $string) ) {
        echo $string.' - yes';
    } else {
        echo $string.' - no';
    }
    echo '<br />';
}
exit();

它搜索字符串以确保它以finder或rfid_finder开头(我真的不确定你喜欢哪一个。如果你想让它只以rfid_finder开头,只需删除rfid_f林德周围的括号和finder之前的尾随?)