在2-3组大括号之间获取文本的好方法

时间:2012-09-11 23:07:21

标签: php string random formatting

我正在使用以下列格式返回文本的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";

来自最初的文字。

如果花括号不能包含另一组花括号,我就没问题了。任何可以帮助我解决这个问题的建议或任何代码?

3 个答案:

答案 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;
}