2

我需要一个可以生成正则表达式的函数。例如,如果我写

$pat = "My {$var} is {$var2}"

生成一个正则表达式,当我使用

preg_match($pat,"My name is Kevin",$matches);

返回

$matches[1] = 'name';
$matches[2] = 'Kevin';

字符串可以是:“我的 $nameword 是 $name,我是 $age 岁”

问题是:

FIG1
<?php
function gen_pattern($string)
{
<--- add code for generating pattern --->
}
?>

FIG2
$pat = gen_pattern('my name is {$X}');
ereg($pat,'my name is moo',$regs);
//$regs[1] == "moo„
([^\s]*)

$pat = gen_pattern('my {$YZ} is {$IJK}');
ereg($pat,'my name is moo',$regs);
//$regs[1] == "name", $regs[2] == "moo"

我的作业描述如下:

图 1 显示了一个可以生成正则表达式的函数,可用于 ereg 函数。

图 2 显示了该模式应该如何工作。在给定的字符串中,每一项{$ABC}代表一个占位符,即{$X}是“我的名字是{$X}”中的单个占位符,而“我的{$YZ}是”中有两个占位符{$IJK}”。占位符可以是任何大于零的长度。

在结果模式中,每个占位符代表文本的一个单词,必须将其添加到结果列表中。即{$X} 表示“我的名字是”之后的下一个单词。因此,如果在文本“my name is moo”上使用该模式,则 $regs[1] 变为“moo”。假设我们只有 [az ]* 形式的文本(注意空格)。

我的任务:

填写图 1 中的绿点。不要费心处理错误或检查给定字符串的正确语法(即不会出现“我的名字是 {{}”或类似的无效输入)。

我不知道从哪里开始。

4

2 回答 2

2

这可能有效:

function gen_pattern($str){
    $str = preg_replace('/(\{[\$a-zA-Z]+\})/', '(\w+)', $str);
    return '/'.$str.'/';
}
$p = gen_pattern('my {$xx} is {$X}');

preg_match($p, 'my name is moo', $m);

$m将会:

array(3) {
  [0] =>
  string(14) "my name is moo"
  [1] =>
  string(4) "name"
  [2] =>
  string(3) "moo"
}
于 2012-06-18T10:00:10.640 回答
0

像这样的东西会帮助你..:

function gen_pattern($string)
{
    return "@".preg_replace("@(\{\$(.*?)\})@msi", "(?P<$2>.*?)", $string)."@";
}

所以你会得到一个以变量为键的结果。

于 2012-06-18T09:59:17.100 回答