Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从正则表达式PHP创建字符串_Php_Regex_Url - Fatal编程技术网

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

从正则表达式PHP创建字符串,php,regex,url,Php,Regex,Url,我正在尝试从正则表达式创建字符串。我注意到,在Kohana框架的路由系统中,可以使用类似于正则表达式的东西设置路由。然后,您可以创建一个与您设置的路由匹配的url。我正在尝试做类似的事情,但我找不到一个干净的方法来做。例如,我得到了以下正则表达式: /^(?<application>\w+)\/(?<controller>\w+)\/(?<method>\w+)\/(?<parameters>\w+)\/?$/ /^(?\w+\/(?\w+)\/

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

/^(?<application>\w+)\/(?<controller>\w+)\/(?<method>\w+)\/(?<parameters>\w+)\/?$/
/^(?\w+\/(?\w+)\/(?\w+)\/(?\w+)\/$/
现在我想说“应用程序”等于“a”,“控制器”等于“b”,“方法”等于“c”,“参数”等于“d”。然后我应该得到一个字符串,用指定的值替换部分。不过,我找不到一个好办法。我基本上想到了两种方法:1)用指定的值替换正则表达式中的相应值,或2)创建自定义的“regex语法”,您可以轻松地使用它创建字符串,并在需要时将其转换为“适当的”正则表达式。科哈纳使用后者,但这两种方法听起来都很糟糕。你会怎么做


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

这应该非常简单,因为
preg\u match
支持命名捕获组(当然,您的正则表达式使用;)

例如:

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


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

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

cat rat
cat  rat
cat   rat
等等

但在你的例子中,没有什么是未定义的

因此,考虑到一个狭窄的用例,您倾向于定义一种“安全的”或作为正则表达式子集的可单独生成的语言是一种很好的选择。然后您可以将出现的
/\(\?P?\)/
替换为其中捕获组的值


但是,由于PHP实际上不允许您在一个步骤中使用捕获组的值来访问替换期间的变量,因此您可能需要在多个步骤中执行此操作…例如,匹配上述组的所有事件,提取命名组,然后最终执行(在
$matches
作为
$match
的循环中)从
'(?P)
'(?)
$$match
的值的简单字符串替换(尽管以一种更安全的方式).

这不清楚。你能给出一个输入字符串和相应的输出字符串的例子吗?我非常熟悉php和正则表达式,但是我不知道你在问什么。你的问题对我来说毫无意义,我建议你从头开始编辑你的问题。但是谁知道,也许其他人能理解。@Oli Charlesworth,Gerry:我理解这可能很难理解,我自己解释它时遇到了困难…我添加了一些文本,希望现在更清楚。@Frog:你的问题现在只是稍微清楚了一点。一般规则是“xyz”->“myXyz”?感谢@Oli Charlesworth!不,这不是我真正的意思。我必须创建一个与正则表达式中的模式对应的字符串,将数组中的值填充到命名组中。我基本上必须做相反的操作:我有正则表达式和值,现在我必须填充正则表达式中的值,因此,我得到了一个字符串,当用正则表达式传递到
preg_match()
时,该字符串将返回相同的值。我解释过了吗?谢谢你的回答!我明白这一点,这正是我现在正在做的。不过,我试图做的是反转此操作:我知道(在你的示例中)“name”是什么和“digit”是什么现在,我想创建一个字符串,该字符串对应于我知道的值的正则表达式模式。例如,我知道“name”等于“test”,而“digit”等于“2000”,那么我的函数应该创建一个字符串“test:2000”.谢谢你的回答@Alan H.!这正是我的意思,你的例子真的很有帮助。所以你认为使用正则表达式子集是最好的方法吗?它不会大幅降低页面速度吗?好吧,你会在每个页面浏览时做多少次这样的事情?少量的次数应该相对来说是无关紧要的。对不起迟来的回复。我确定昨天我检查时,您的答案没有显示在这里。无论如何,在每个页面视图上可能不会出现超过3次。我目前正在创建自己的子集,而且实际上进展得很顺利。:)
Array
(
    [0] => foobar: 2008
    [name] => foobar
    [1] => foobar
    [digit] => 2008
    [2] => 2008
)
cat rat
cat  rat
cat   rat