我认为这是我正在寻找的一种奇怪的东西。
我有以下文字字符串:
$string = "The compass is pointing <north|south|east|west> towards <London|Paris|Rome>";
不知何故,我想解析它以获得以下任何输出:
对于每组&lt; &GT;在文本字符串中我需要将内容转换为数组(使用explode("|",$string)
?),然后在该数组上运行array_rand
以获取我们将显示的选项的键,然后只读取数组和返回那个值。
问题是,我几乎没有文本解析的经验,但我猜你在这类问题中使用preg_replace
。
如果有人能帮助我开始,我会很感激。
答案 0 :(得分:1)
您可以使用preg_replace_callback()
执行选择随机替换的函数。
$string = "The compass is pointing <north|south|east|west> towards <London|Paris|Rome>";
$callback = function ($match) {
$opts = explode('|', $match[1]);
return $opts[array_rand($opts)];
};
echo preg_replace_callback('/<(.+?)>/', $callback, $string);
模式匹配<
,任何内容(.+
)和>
。 "lazy" quantifier ?
会在+
找到最短匹配时停止,而不是“贪婪”并寻找最长的匹配(这是默认行为)。没有它,它将一直匹配到最后>
,这太过分了。
( )
会创建一个子模式,因此虽然$match[0]
与整个模式(包括< >
)相匹配,但$match[1]
只会包含子模式(不包含{ {1}})。
每次找到匹配时都会调用回调函数,它会完全按照您的描述 - < >
选项列表并返回一个随机函数。然后返回值替换原始匹配。