正则表达式规则匹配值并替换为特定的相关值

时间:2014-05-27 10:59:01

标签: php regex codeigniter

这主要是一个正则表达式问题,但它正在 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个正则表达式线来完成吗?

3 个答案:

答案 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);

如果更换很简单,则甚至不需要正则表达式。一个简单的sscanf()explode()(带有list结构)就足够了。

Demo

答案 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';

我认为这会奏效!