1

これは私が探している奇妙な種類のものだと思います。

次のテキスト文字列があります。

$string = "The compass is pointing <north|south|east|west> towards <London|Paris|Rome>";

どういうわけか、これを解析して、次の出力のいずれかを取得したいと考えています。

  • コンパスはパリに向かって北を指しています
  • コンパスはロンドンに向かって南を指しています
  • コンパスは東のローマを指している
  • コンパスは東のロンドンを指している
  • 等。

テキスト文字列内の < > のセットごとに、内容を (? を使用して) 配列に変換し、その配列explode("|",$string)で実行array_randして、表示するオプションのキーを取得し、配列を読み取ってその値を返す必要があります。

preg_replace問題は、私はテキスト解析の経験がほとんどないことですが、このタイプの問題で使用すると思います。

誰かが私を始めるのを手伝ってくれたら幸いです。

4

1 に答える 1

1

preg_replace_callback()ランダムな置換を選択する関数を実行するために使用できます。

$string = "The compass is pointing <north|south|east|west> towards <London|Paris|Rome>";

$callback = function ($match) {
    $opts = explode('|', $match[1]);
    return $opts[array_rand($opts)];
};

echo preg_replace_callback('/<(.+?)>/', $callback, $string);

実施例

パターン<は 、任意のもの ( .+)、および>. 「怠惰な」量指定子 ?は、+「貪欲」で可能な限り最長の一致を探すのではなく、最短の一致を見つけたときに停止します (これはデフォルトの動作です)。これがないと、最後の まで一致して>しまい、遠すぎます。

( )サブパターンを作成するため、 while$match[0]はパターン全体 ( を含む< >) に一致するもの$match[1]であり、サブパターンのみが含まれます ( なし< >)。

コールバック関数は、一致が見つかるたびに呼び出され、explode()オプションのリストを正確に実行し、ランダムなものを返します。戻り値は、元の一致を置き換えます。

于 2012-08-05T23:59:35.297 に答える