2

最初の実行でそれらを実行せずに preg_replace にいくつかのルールを適用する方法を考えています。少し複雑なので、例に基づいて説明します。

入力:

$string = 'The quick brown fox jumps over the lazy freaky dog'; 

ルール:

  • aiouに置き換えます(単語の先頭でない場合 & 母音の前後でない場合)
  • euiに置き換えます(単語の先頭でない場合 & 母音の前後でない場合)
  • eaiに置き換えます(単語の先頭でない場合)
  • 単語全体を置き換えます。つまり、 dogcatに、foxwolfに置き換えます(上記のルールを適用せずに)。

出力: 素早く茶色いオオカミが、元気で気難しい猫の上を飛び跳ねる




私はそのようなものから始めました:(Ezequiel Munsのおかげで編集されました

$patterns = array();
$replacements = array();

$patterns[] = "/(?<!\b|[aeiou])[aio](?![aeiou])/";
$replacements[] = "u";

$patterns[] = "/(?<!\b|[aeiou])[eu](?![aeiou])/";
$replacements[] = "i";

$patterns[] = '/ea/';
$replacements[1] = 'i';

$patterns[] = '/dog/';
$replacements[0] = 'cat';

echo preg_replace($patterns, $replacements, $string);

出力:

Thi qiick briwn fix jimps ivir thi lizy friiky dig



編集:

ご覧のとおり、問題はすべてのルールが前のルールによって上書きされることです。

例「キツネ」:

  1. ルール:キツネフックスに変える
  2. ルール: fuxfixに変える

キャラクターがすでに前のルールの影響を受けている場合、次のルールを回避する方法はありますか?

これは理にかなっていますか?

4

1 に答える 1

3

まず、置換条件について明示する必要があります。ルールには、「単語の先頭ではなく、母音の前後ではない」と記載されていますが、正規表現ではそれを実装していません。これは、Negative Lookahead/Lookbehindを使用して行うことができます。例えば:

  1. a、i、oをuに置き換えます(単語の先頭にない場合、および母音の前後にない場合)

以下で実装できます:

$patterns[] = "/(?<!\b|[aeiou])[aio](?![aeiou])/";
$replacements[] = "u";

このメソッドは、最初の3つのルールを実装するために使用できます。

次の問題は、「fox」と「dog」が最初の3つのルールの影響を受けるため、変更されたバージョンを「wolf」と「cat」に置き換える必要があることです。したがって、犬=>猫の場合:

$patterns[] = "/\bdug\b/";
$replacements[] = "cat";

注:preg_replaceは配列で機能するため、$patterns配列と$replacements配列では誤解を招く可能性があるため、インデックスを使用しない方がはるかに優れています。上記のように[]演算子をペアで使用すると、何が何に対応するかが常にわかります。

パート2:

あは。そうか。交換を独占的にする必要があります。

問題のある最初のケースの両方に一致する正規表現を使用できます。次に、preg_replaceの興味深い奇妙な機能を使用できます。e修飾子を追加すると、代わりに置換文字列がPHPコードとして評価されます。これをキャプチャグループと組み合わせると、一致したものに応じて、を出力するuか、を出力するかを決定できます。i

$patterns[] = "/(?<!\b|[aeiou])([aeiou])(?![aeiou])/e";
$replacements[] = '("$1" == "e" || "$1" == "u")? "i":"u"';

*母音マッチングクラスの周りの/eと()に注意してください。

于 2010-08-10T00:18:47.607 に答える