我正在使用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
。
结果是我得到了与输入相同的字符串。我想获得例如输出:
十亿美元在广阔的竞技场中只是一个很小的阶段。
有人建议我在做什么错吗?
答案 0 :(得分:3)
您当前的代码将如何生成任何内容。
您的正则表达式不合适。它匹配嵌套的方括号内容,而不是括号。如果没有嵌套的括号,请尝试{([^}]*)}
来capturing {
... }
到$m[1]
中的所有内容。
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);
在庞大的罗马竞技场中,十亿美元是一个短暂的阶段。
(如果PHP> = 5.3,您也可以使用anonymous function)