从正则表达式PHP创建字符串

时间:2011-08-15 20:38:39

标签: php regex url

我正在尝试从正则表达式创建一个字符串。我注意到在Kohana框架的路由系统中,您可以使用类似于正则表达式的东西来设置路由。然后,您可以创建与您设置的路线匹配的网址。我正在尝试做类似的事情,但我找不到干净的方法去做。我举例说明了以下正则表达式:

/^(?<application>\w+)\/(?<controller>\w+)\/(?<method>\w+)\/(?<parameters>\w+)\/?$/

现在我希望能够说“应用程序”等于“a”,“控制器”等于“b”,“方法”等于“c”,“参数”等于“d”。然后我应该得到一个字符串,用指定的值替换部分。我找不到一个很好的方法来做到这一点。我基本上想到了两种方法:1)用指定的值替换正则表达式中的相应值,或者2)创建一个自定义的“正则表达式语法”,您可以轻松地将其用于创建字符串并将其转换为“正确的” “需要时正则表达。 Kohana使用后者,但这两种方式听起来都很糟糕。你会怎么做?

编辑:我会尝试澄清一下。我例如使用preg_match()将以下字符串传递给上面显示的正则表达式:“myApplication / myController / myMethod / myParameters”。这将返回一个包含两个项目的数组,包括4个带有索引“application”,“controller”,“method”和“parameters”的项目以及相应的值。现在我必须使用正则表达式的模式创建字符串“myApplication / myController / myMethod / myParameters”,而我只有4个项目的数组。我怎么能用PHP做到这一点?

1 个答案:

答案 0 :(得分:2)

鉴于preg_match支持命名捕获组(当然,您的正则表达式使用; more here),这应该非常简单。

示例from PHP documentation

<?php

$str = 'foobar: 2008';

preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);

/* This also works in PHP 5.2.2 (PCRE 7.0) and later, however 
 * the above form is recommended for backwards compatibility */
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

print_r($matches);

?>

以上示例将输出:

Array
(
    [0] => foobar: 2008
    [name] => foobar
    [1] => foobar
    [digit] => 2008
    [2] => 2008
)

因此,在您的情况下,您可以使用$matches数组,例如: $matches['application']


编辑:好的,我没有完全理解这个问题。

使用正则表达式生成字符串的一个明显问题是正则表达式可以匹配无限字符串。例如,/cat\s+rat/匹配所有:

cat rat
cat  rat
cat   rat

但在你的例子中,没有任何未定义。

因此,鉴于一个狭窄的用例,您倾向于定义一个“安全”或单一可生成语言,这是正则表达式的一个子集。然后,您可以将/\(\?P?<(\w+)>\)/的出现次数替换为其中捕获组的值。

但是,由于PHP实际上并没有让您只使用捕获组的值来在一步中替换期间访问变量,因此您可能需要在多个步骤中执行此操作...匹配上述组的所有出现,提取命名组,然后最终($matches循环为$match)从'(?P<' . $match . '>)''(?<' . $match . '>)'进行简单的字符串替换到$$match的值(虽然比这更安全)。