-1

部分的なヘルプが見つかりましたが、必要なことを完全に達成できないようです。次のことができる必要があります。

3 文字を超える 2 つの単語の間にある 1 ~ 3 文字の単語を、match any 式に置き換える正規表現が必要です。

例えば:

walk to the beach ==> walk(.*)beach

1 ~ 3 文字の単語の前に 3 文字を超える単語がない場合、その 1 ~ 3 文字の単語を'<word> ?'

例えば:

on the beach ==> on ?the ?beach

ルールは単純であるほど良いです (もちろん、よりパフォーマンスが高く、より複雑な代替バージョンがある場合は、それを採用しますが、最終的には大量に使用されることが予想されます)。

これは、PHP コンテキストで使用される可能性が高く、preg_replace. したがって、その文脈に置くことができれば、さらに良いでしょう!

ちなみに、これまでに入手したものは以下のとおりです。

$string = preg_replace('/\s+/', '(.*)', $string); 
$string = preg_replace('/\b(\w{1,3})(\.*)\b/', '${1} ?', $string);

しかし、それは次の結果になります:

walk to the beach ==> 'walk(.*)to ?beach' 

これは私が望むものではありません。'on the beach'正しく翻訳されているようです。

4

1 に答える 1

-2

そのためには2つの交換が必要になると思います。最初の要件から始めましょう。

$str = preg_replace('/(\w{4,})(?: \w{1,3})* (?=\w{4,})/', '$1(.*)', $str);

もちろん、これら\w(文字、数字、およびアンダースコアに一致するもの) を、実際に単語文字として扱いたいものの文字クラスに置き換える必要があります。

2 つ目の方法は、一致がオーバーラップできず、後読みを可変長にすることができないため、少し難しくなります。したがって、これをループで複数回実行する必要があります。

do
{
    $str = preg_replace('/^\w{0,3}(?: \w{0,3})* (?!\?)/', '$0?', $str, -1, $count);
} while($count);

ここでは、スペースで区切られた最大 3 文字の単語と、末尾に 1 つのスペース (まだ a が続いていない場合のみ?) のみである限り、文字列の先頭からすべてを照合します。次に、すべてを元の場所に戻し、 を追加します?

アップデート:

コメントでのすべての話の後、ここに更新されたソリューションがあります。

最初の行を実行した後、残っているのは 3 文字未満の単語だけが文字列の先頭または末尾にあると想定できます。他のすべては に折りたたまれ(.*)ます。でそれらの間にすべてのスペースを追加したいので?、ループさえ必要ありません(実際、これらは残っている唯一のスペースです):

$str = preg_replace('/ /', ' ?', $str);

(コードの最初の行の直後にこれを行います。)

これにより、次の 2 つの結果が得られます (最初の行と組み合わせて)。

let us walk on the beach now go => let ?us ?walk(.*)beach ?now ?go
let us walk on the beach there now go => let ?us ?walk(.*)beach(.*)there ?now ?go
于 2012-10-27T22:47:49.553 に答える