我假设你的源字符串是这样的:
{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()
因为我假设您希望能够在许多地方使用相同的条目(即“{this|that} foo {this|that}” str_replace()
。替换两者,而我认为这是不需要的。所以我们在字符串中得到了偏移量,可以轻松计算字符串的长度,但这足以进行一些手术,并切断我们的条目并进行替换。其他更清洁的方法是使用preg_replace_callback()并把所有的“逻辑”