1

\n複数行の文字列を変換して、 2 つの最後の閉じ括弧が連続して発生した後に))改行を挿入しようとしてい))\nます。

また、'))' の直前に ')' がある可能性が高く、')))' を効果的に作成します。

これらの 2 つまたは 3 つの括弧は、 、 、 、 などの不確定な長さの空白によって「広がる」場合もあれば、そうで))ない) )場合)))) ) )あり)) )ます) ))

私は次のことを試しました:

//Example message
$message = '(item (name 286) (Index 31) (Image "item001") (class money coin) (code 4 110 0) (country 2) (plural 1) (buy 0))
(item(name 7904)(Index 7904) (specialty (Dex 10(defense 55)(hp 3500)(dodge 71)          ))

(item(name 7905)(Index 7905)(country 2) 
(level 80)(specialty(hp 3400)               )                               )

(item(name 7906)(Index 7906)(level 80)      (specialty(Str 10))                             ) ';

// Converts all lines into one line    
$message =  preg_replace("/[\r\n]*/","",$message); 

// Replace '))' with '))\n' - doesn't work.
$message =  preg_replace("/[)s+)]s*/","\n",$message); 

$InititemLines = explode("\n", $message);
for ($line = 0; $line < count($InititemLines); $line++) {
    echo "Line #<b>{$line}</b> : " . $InititemLines[$line] . "<br />\n";
}

すべての行を 1 つに変換するには、次を使用しました。

$message = preg_replace("/[\r\n]*/","",$message);

次に、に置き換えるため))))\n、次のことを試しました(ただし、機能しません):

$message = preg_replace("/[)s+)]s*/","))\n",$message);

出力を次のようにしたい:

Line #0: (item (name 286) (Index 31) (Image "item001") (class money coin) (code 4 11 0 0) (country 2) (plural 1) (buy 0))
Line #1: (item(name 7904)(Index 7904) (specialty    (Dex 10)(defense 55)(hp 3500)(dodge 71)         ))
Line #2: (item(name 7905)(Index 7905)(country 2)(level 80)(specialty(hp 3400)       )           )
Line #3: (item(name 7906)(Index 7906)(level 80)     (specialty(Str 10))     )
4

2 に答える 2

1

)))これは、またはで終わる行の場合、すべての行の末尾にある "))" を置き換えます))

$message = Preg_replace( "\)?(\s*\)\s*\))", "$1\n", $message );

この正規表現は、

  • オプションの一重括弧 ')' を見つけます。括弧は正規表現で特別な意味を持つため、')' としてエスケープします。末尾に「?」があるため、省略可能です。
  • '\s' として示される 0 個以上の空白文字が続きます。'*'で示される0以上、
  • その後に別の ')' が続きます
  • その後に別の 0 個以上のスペースが続き、
  • その後に別の ')' が続きます
  • \s*\)\s*\)次に、「このセクションをグループ化して、後で参照できるようにする」という意味の '(' と ')' のペアで囲みます。に置き換えることができるようにこれを行い))\nます。

そして、より洗練された解決策は(要件に応じて...)、その後、すべての「)」の前から余分な残りのスペースを削除することです。

$message = preg_replace("(\)\s*)", "\)", $message);

この正規表現は、

  • オペレーティング ')' を見つけます。
  • 0 個以上のスペースが続く
  • グループ化されているので、交換できます。

(あなたの例では、これにより余分な空白がすべて削除され、文字列のスペースはそのままになると思います)。

于 2012-10-13T14:47:33.577 に答える
0

ありがとうございます

$message = Preg_replace("/(\s*\)\s*\)?\s*\))/", "$1\n", $message );
于 2012-10-13T15:23:59.670 に答える