我的正则表达式技能很差。为了让我的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之前的尾随?)