Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Regex在特定系列的令牌之后插入换行符_Php_Preg Replace - Fatal编程技术网

Php Regex在特定系列的令牌之后插入换行符

Php Regex在特定系列的令牌之后插入换行符,php,preg-replace,Php,Preg Replace,我试图转换一个多行字符串,在两个最后的右括号串联出现后插入换行符,即:)变成)\n 也可能在“)”之前有一个“)”,有效地创建了“))” 这两个或三个括号可以或不可以由不确定长度的空格“展开”,例如),),)),)),)),)),)等等 我尝试了以下方法: //Example message $message = '(item (name 286) (Index 31) (Image "item001") (class money coin) (code 4 110 0) (country 2)

我试图转换一个多行字符串,在两个最后的右括号串联出现后插入换行符,即:
变成
)\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";
}
然后,为了将
替换为
)\n
,我尝试了以下方法(但无效):

我希望输出如下:

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))     )
这将替换所有行尾的“)”,如果行尾为

$message=Preg\u replace(“\)?(\s*\)\s*\)”、“$1\n”、$message)

这个正则表达式的意思是

  • 查找可选的单右括号“')”。我们将其转义为“'),因为括号在正则表达式中有特殊含义。它是可选的,因为尾随“?”
  • 后跟表示为“\s”的0个或多个空格字符。0或更多由“*”表示
  • 接着是另一个“)”
  • 后跟另一个0或更多空格
  • 接着是另一个“)”
  • 然后我们在
    \s*\)\s*\)
    周围加上一对“('和')”,意思是“将此部分分组,以便以后参考”。我们这样做是为了将其替换为
    )\n

然后,一个更优雅的解决方案可能是(取决于您的需求…),随后还可以从每个“')之前去除多余的剩余空间:

$message=preg\u replace(“(\)\s*”,“\)”,$message)

这个正则表达式的意思是

  • 查找正在运行的“')”
  • 后跟0或更多空格
  • 分组,以便我们可以替换
(在您的示例中,我相信这将去除所有多余的空格,而只保留字符串中的空格)。

这将替换所有行末尾的“)”,在以
结尾的行中)

$message=Preg\u replace(“\)?(\s*\)\s*\)”、“$1\n”、$message)

这个正则表达式的意思是

  • 查找可选的单右括号“')”。我们将其转义为“'),因为括号在正则表达式中有特殊含义。它是可选的,因为尾随“?”
  • 后跟表示为“\s”的0个或多个空格字符。0或更多由“*”表示
  • 接着是另一个“)”
  • 后跟另一个0或更多空格
  • 接着是另一个“)”
  • 然后我们在
    \s*\)\s*\)
    周围加上一对“('和')”,意思是“将此部分分组,以便以后参考”。我们这样做是为了将其替换为
    )\n

然后,一个更优雅的解决方案可能是(取决于您的需求…),随后还可以从每个“')之前去除多余的剩余空间:

$message=preg\u replace(“(\)\s*”,“\)”,$message)

这个正则表达式的意思是

  • 查找正在运行的“')”
  • 后跟0或更多空格
  • 分组,以便我们可以替换

(在您的示例中,我相信这将去除所有多余的空格,而只保留字符串中的空格)。

谢谢您使用它

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

谢谢你让它工作得很好

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

如果有一个项目只有)没有)比如(项目(名称286)(索引31)(类别货币)(购买0)呢因为当我尝试使用你的方式时,它不会替换它,当我尝试仅使用它)在preg_替换它时,它不会将其他项替换为have())是否只选择最后一项)并替换它们以使其工作)和())是的,这正是我寻找方法仅选择最后一项)并替换为()\n警告:preg_replace()[function.preg replace]:在C:\xampp\htdocs\testgot\index.php的第行中,分隔符不能是字母数字或反斜杠21@DragoN抱歉,这是因为我没有在替换字符串中转义文字“(”。您使用
$1
匹配的方法是(我怀疑)计算成本更高,但它的含义更明确,因此我认为是一种更好的方法。更新了我的答案以反映。如果有一个项目只有)没有)怎么办)比如(项目(名称286)(索引31)(类别货币)(购买0))因为当我尝试使用你的方式时,它不会替换它,当我尝试仅使用它)在preg_替换它时,它不会将其他项替换为have())是否只选择最后一项)并替换它们以使其工作)和())是的,这正是我寻找方法仅选择最后一项)并替换为()\n警告:preg_replace()[function.preg replace]:在C:\xampp\htdocs\testgot\index.php的第行中,分隔符不能是字母数字或反斜杠21@DragoN抱歉,这是因为我没有在替换字符串中转义文字“(”。您使用
$1
匹配的方法是(我怀疑)计算成本更高,但它的含义更清楚,因此我认为这是一个更好的方法。更新了我的答案以反映。
$message = Preg_replace("/(\s*\)\s*\)?\s*\))/", "$1\n", $message );