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 );