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} は「my name is {$X}」の単一のプレースホルダーであり、「my {$YZ} is」には 2 つのプレースホルダーがあります。 {$IJK}". プレースホルダーは、ゼロより大きい任意の長さにすることができます。

結果のパターンでは、各プレースホルダーはテキストの 1 つの単語を表し、結果リストに追加する必要があります。つまり、{$X} は「私の名前は」の次の単語を表します。その結果、テキスト「my name is moo」でこのパターンを使用すると、$regs[1] は「moo」になります。[az ]* の形式のテキストのみがあると仮定します (空白に注意してください)。

私のタスク:

図 1 の緑色の部分を埋めてください。エラー処理や特定の文字列の正しい構文のチェックに煩わされる必要はありません (つまり、"my name is {{}" などの無効な入力は発生しません)。

そして、どこから始めればよいかわかりません。

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 に答える