3

次の形式でテキストを返す API を使用しています。

{欲しい|必要} この{ばか|すごい|苛立たしい}文を {急速に|素早く}フォーマットしてランダムに|回転させてランダ​​ムにする}

PHP を使用して、次のように文字列をフォーマットする必要があります。

"I need to make this irritating sentence formatting quickly";

また

"I want to make this awesome sentence spin and be random";

最初のテキストから。

中かっこに別の中かっこのセットを含めることができなくても、問題はありません。この問題の解決に役立つアドバイスやコードはありますか?

4

3 に答える 3

1

ソース文字列は次のようになっていると想定しました。

{I want|I need} to make this {stupid|awesome|irritating}
sentence formatting {rapidly|quickly} and {random|spin and be random} 

そうしないと、ブラケットがネストされ、出力例がソース文字列に配置する方法と一致しません。次に、preg_match_all()次のように使用します。

preg_match_all("/{.*}/U",$sourceString, $result, 
                      PREG_PATTERN_ORDER|PREG_OFFSET_CAPTURE);

あなた$sourceStringが生成するもの:

array(1) {
  [0]=>
  array(4) {
    [0]=>
    array(2) {
      [0]=>
      string(15) "{I want|I need}"
      [1]=>
      int(0)
    }
    [1]=>
    array(2) {
      [0]=>
      string(27) "{stupid|awesome|irritating}"
      [1]=>
      int(29)
    }
    [2]=>
    array(2) {
      [0]=>
      string(17) "{rapidly|quickly}"
      [1]=>
      int(77)
    }
    [3]=>
    array(2) {
      [0]=>
      string(27) "{random|spin and be random}"
      [1]=>
      int(99)
    }
  }
}

そして、すべてのアイテムを取得します。explode()次に、 「|」の「{」と「}」を削除して、各エントリを処理できます。選択するオプションの配列を取得します。次に、必要なものを選択し、以前に見つかったアイテムをそれに置き換えます。str_replace()多くの場所で同じエントリを使用できるようにしたいと想定しているため、最終的にはできないため、一致するパターンが見つかったオフセットをキャプチャすることに注意してくださいstr_replace()(つまり、「{this|that} foo {this|that}」。私はそれが望ましくないと思いますが、両方を交換してください.したがって、文字列にオフセットがあり、文字列の長さは簡単に計算できますが、これはいくつかの手術を行うのに十分であり、エントリを切り取り、置換を配置します.他の, よりクリーンなアプローチは使用することです. preg_replace_callback()そしてそのすべての「ロジック」を置きます

于 2012-09-11T23:17:31.597 に答える
0

これはおそらく数行のコードでは実行されません。コードをネストしているため、正規表現を使用して入力を適切に解析することさえできませんでした。

私の簡単なアイデアは、入力をXMLに変換し、SimpleXMLクラスを使用して入力を解析し、その上にASTを構築して、目的の出力に簡単に変換できるようにすることでした。

簡単な例

$xml = "<root>" .
        str_replace(
                array("{", "}"),
                array("<t>", "</t>"),
                $input) . 
        "</root>";

$dom = new SimpleXMLElement($xml);
//...
于 2012-09-11T23:25:30.903 に答える
0

わかりました、これはあなたが提供した文に基づいて機能しますが、本番環境に移行する前にさらにテストします. (たとえば、他の{}またはを持つことはできません|)

http://codepad.viper-7.com/HpJKOt

<?php

$string = "{I want|I need} to make this {stupid|awesome|irritating} sentence {formatting {rapidly|quickly} and random|spin and be random}";

echo parseString($string);

function parseString($string) {

    // look for {abc|def}
    if (preg_match_all("/\{(([^\{\|\}]*)\|)+([^\{\|\}]*)\}/", $string, $matches, PREG_OFFSET_CAPTURE)) {

        // trim {} and put into array
        $options = explode('|', substr($matches[0][0][0], 1, -1));

        // randomize
        shuffle($options);

        // make the replacement
        $string = str_replace($matches[0][0][0], $options[0], $string);

        // check again
        return parseString($string);
    }

    return $string;
}
于 2012-09-12T00:08:55.987 に答える