我正在使用以下列格式返回文本的API:
{我想|我需要}来做出这个{愚蠢的|刺激性}句子 {formatting {rapid | rapid} and random | spin and be random}
使用PHP,我需要格式化字符串,如:
"I need to make this irritating sentence formatting quickly";
OR
"I want to make this awesome sentence spin and be random";
来自最初的文字。
如果花括号不能包含另一组花括号,我就没问题了。任何可以帮助我解决这个问题的建议或任何代码?
答案 0 :(得分:1)
我假设您的源字符串是这样的:
{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 | }}。str_replace()
会替换两者,而我认为这是不可取的。所以我们在字符串中得到了偏移,字符串的长度可以很容易地计算出来,但这足以做一些手术,并切断我们的输入和其他更干净的方法是使用preg_replace_callback()并将所有“逻辑”放在回调中,这样你就可以一次完成整个处理。
答案 1 :(得分:0)
这可能不是在几行代码中完成的。因为您有嵌套代码,所以甚至无法使用正则表达式来正确解析输入。
我的一个简单想法是将输入转换为XML并使用SimpleXML类来解析输入并构建在AST之上,这可以很容易地转换为您想要的输出。
一个简单的例子
$xml = "<root>" .
str_replace(
array("{", "}"),
array("<t>", "</t>"),
$input) .
"</root>";
$dom = new SimpleXMLElement($xml);
//...
答案 2 :(得分:0)
好的,这可以根据您提供的句子进行,但我会在转向制作之前对其进行更多测试。 (例如,您不能拥有任何其他{
,}
或|
)
http://codepad.viper-7.com/HpJKOt
<?php
$string = "{I want|I need} to make this {stupid|awesome|irritating} sentence {formatting {rapidly|quickly} and random|spin and be random}";
echo parseString($string);
function parseString($string) {
// look for {abc|def}
if (preg_match_all("/\{(([^\{\|\}]*)\|)+([^\{\|\}]*)\}/", $string, $matches, PREG_OFFSET_CAPTURE)) {
// trim {} and put into array
$options = explode('|', substr($matches[0][0][0], 1, -1));
// randomize
shuffle($options);
// make the replacement
$string = str_replace($matches[0][0][0], $options[0], $string);
// check again
return parseString($string);
}
return $string;
}