1

\n我正在尝试转换一个多行字符串,以在两个最后的右括号连续出现后插入换行符,即:))变为))\n.

也可能在 '))' 之前有一个 ')',有效地创建了 ')))'。

这两个或三个括号可能会或可能不会被不确定长度的空格“展开”,例如)), ) ), ))), ) ) ),)) )等等) ))

我尝试了以下方法:

//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";
}

要将所有行转换为一行,我使用了:

$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

这将替换所有行末尾的“))”,如果行以)))or结尾))

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

这个正则表达式意味着

  • 找到一个可选的单右括号')'。我们将其转义为 ')' 因为括号在正则表达式中具有特殊含义。它是可选的,因为尾随“?”。
  • 后跟 0 个或多个空格字符,表示为 '\s'。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 回答