1

我想这是我正在寻找的一种奇怪的东西。

我有以下文本字符串:

$string = "The compass is pointing <north|south|east|west> towards <London|Paris|Rome>";

我想以某种方式解析它以获得以下任何输出:

  • 指南针向北指向巴黎
  • 指南针向南指向伦敦
  • 指南针向东指向罗马
  • 指南针向东指向伦敦
  • 等等。

对于文本字符串中的每一组 < >,我需要将内容转换为一个数组(使用explode("|",$string)?),然后array_rand在该数组上运行以获取我们将显示的选项的键,然后读取数组并返回该值。

问题是,我几乎没有文本解析的经验,但我猜你会preg_replace在这类问题中使用。

如果有人可以帮助我入门,我将不胜感激。

4

1 回答 1

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);

工作示例

模式匹配<、任何东西 ( .+) 和>. “惰性”量词 ?+找到最短匹配时停止,而不是“贪婪”并寻找最长的匹配(这是默认行为)。没有它,它会一直匹配到最后一个>,这太远了。

( )创建一个子模式,所以 while$match[0]将是整个模式(包括< >)匹配的内容,将$match[1]只包含子模式(没有< >)。

每次找到匹配项时都会调用回调函数,它完全按照您explode()的描述执行 - 选项列表并返回一个随机选项。然后返回值替换原始匹配。

于 2012-08-05T23:59:35.297 回答