这主要是一个正则表达式问题,但它正在 Codeigniter的路由文件中使用。路由文件是尝试匹配的正则表达式规则列表。因此需要1个衬垫。
采取以下4个字符串:
techniques/foo3
news/bar-4-22
reviews/non23-a
features/wins
我正在寻找1行正则表达式规则,它将找到技术,新闻,评论或功能,并替换为特定的int值5,1,7或3.该数字对应于名称,因此技术= 5,新闻= 1,评论= 7,特征= 3。斜杠后的最后一个值可以是任何URL友好的文本字符串。我会按原样选择这个。我基本上想将它们转换为以下内容:
categorysearch/5/foo3
categorysearch/1/bar-4-22
categorysearch/7/non23-a
categorysearch/3/wins
这可以用1个正则表达式线来完成吗?
答案 0 :(得分:2)
像这样使用preg_replace_callback()
:
$tokens = [
'techniques' => 5,
'news' => 1,
'reviews' => 7,
'features' => 3
];
echo preg_replace_callback('#^([^/]+)/(.*)$#', function ($m) use ($tokens) {
if (array_key_exists($m[1], $tokens)) {
return sprintf('%s/%d/%s', $m[1], $tokens[$m[1]], $m[2]);
}
return sprintf('%s/%s', $m[1], $m[2]);
}, $string);
答案 1 :(得分:0)
你不应该使用正则表达式 - 它们对于像这样的简单事物来说效率不高,而且是针对更复杂的场景而设计的。
以下将完成这项工作(有更好的方法,但这是最容易遵循的!)
$rawstring = "techniques/foo3"
$find = array('techniques', 'news', 'reviews', 'features');
$replace = array('5', '1', '7', '3');
$return = str_replace($find, "categorysearch/" . $replace, $rawstring);
//$return = "categorysearch/5/foo3"
这种方式也很有效,并且很容易跟随像我这样的小说:-P Amals的答案远远超过!!
答案 2 :(得分:0)
$route['techniques/(:any)'] = 'categorysearch/5/$1';
$route['news/(:any)'] = 'categorysearch/1/$1';
我认为这会奏效!