Php 匹配正则表达式

Php 匹配正则表达式,php,regex,codeigniter,Php,Regex,Codeigniter,我的正则表达式技能很差。为了让我的js/css显示正确的菜单,我在li中添加了一个“selected”类,以便js知道哪个是当前项(以便它可以显示下拉列表的其余部分) 我的问题是在codeigniter中匹配正确的uri字符串: <li <? if((strstr($this->uri->uri_string(),"rfid_finder/finder")) || (strstr($this->uri->uri_string(),"finder"))) {?&

我的正则表达式技能很差。为了让我的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>
但当用户访问时:

rfid_finder/search_form
第一个菜单未指定所选的类

更新


我希望第一个代码段与路径匹配,而不是
rfid\u finder/search
路径-我有第二行代码与rfid\u finder/search\u表单路径匹配。我的问题在于尝试使用
(strstrstr($this->uri->uri_string(),“finder”)
捕获路由。它匹配我的所有路由,即使是
rfid_finder/search_表单
嗯,让我知道这是否适用于您。它似乎在我的测试中起作用

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();
$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($string=>$match的路由){
如果(预匹配('.^(rfid查找器/)?查找器/?([a-z0-9]+?)?(/[a-z0-9]+?)?(/[a-z0-9]+?)?(/\d+?)?$i',$string)){
echo$string。“-是”;
}否则{
echo$string。“-否”;
}
回声“
”; } 退出();

它搜索字符串以确保它以finder或rfid\u finder开头(我不确定您喜欢哪个。如果您希望它仅以rfid\u finder开头,只需删除rfid\u finder周围的括号和尾随?before finder)

在您写任何字符的地方,您想要任何字符还是只想要字母?:任何字符都可以是用户名或标记-应该是字符串(数字和字符)我不明白:所以一切都正常,但当你去搜索表单时,你不想让它匹配,对吗?我更新了问题,对问题做出了更好的解释,以回应你的编辑。你可以尝试使用strpos代替,并使用偏移量。尽管我上面发布的正则表达式似乎可以满足你的需要(至少从我的理解来看)
$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();