根据模式解析字符串

时间:2018-08-12 18:02:34

标签: php regex

我正在使用php 5解析字符串。我的输入字符串如下所示:

  

{十亿是|百万是|万亿是} {一个极| a |慷慨地|   巨大的{极小|小|小|短|小}阶段   {银河| |大|巨大|时态|大|宇宙}   {universe | Colosseum | planet | arena}。

在我的最小可行示例下面查找:

<?php

function process($text)
{
    return preg_replace_callback('/\[(((?>[^\[\]]+)|(?R))*)\]/x', array(
        $this,
        'replace'
    ), $text);
}
function replace($text)
{
    $text  = $this->process($text[1]);
    $parts = explode('|', $text);
    return $parts[array_rand($parts)];
}

$text = "{Billion is|Millions are|Trillion is} {an extremely |a| a generously | a very} { tiny|little |smallish |short |small} stage in a vast {galactic| |large|huge|tense|big |cosmic} {universe|Colosseum|planet|arena}.";

$res = process($text);

echo $res;

如您所见,我正在尝试使用上述正则表达式{Billion is|Millions are|Trillion is}来解析以下模式:/\[(((?>[^\[\]]+)|(?R))*)\]/x

结果是我得到了与输入相同的字符串。我想获得例如输出:

  

十亿美元在广阔的竞技场中只是一个很小的阶段。

有人建议我在做什么错吗?

1 个答案:

答案 0 :(得分:3)

您当前的代码将如何生成任何内容。

  1. 您的正则表达式不合适。它匹配嵌套的方括号内容,而不是括号。如果没有嵌套的括号,请尝试{([^}]*)}capturing { ... }$m[1]中的所有内容。

  2. Read about preg_replace_callback()。第二个参数不能是数组。

经过一些进一步调整的有效代码如下:

function process($text) {
  return preg_replace_callback('/{([^}]*)}/', 'replace', $text);
}

function replace($m) {
  $parts = explode('|', $m[1]);
  shuffle($parts);
  return $parts[0];
}

$text = "{Billion is|Millions are|Trillion is} {an extremely|a|a generously|a very} {tiny|little|smallish|short|small} stage in a vast {galactic||large|huge|tense|big|cosmic} {universe|Colosseum|planet|arena}.";

echo process($text);
  

在庞大的罗马竞技场中,十亿美元是一个短暂的阶段。

Here is a demo at eval.in

(如果PHP> = 5.3,您也可以使用anonymous function