解析包含自定义条件的纯文本

时间:2012-08-05 23:48:39

标签: php

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

我有以下文字字符串:

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

不知何故,我想解析它以获得以下任何输出:

  • 指南针向北指向巴黎
  • 罗盘朝南指向伦敦
  • 指南针向东指向罗马
  • 指南针向东指向伦敦

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

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

如果有人能帮助我开始,我会很感激。

1 个答案:

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

working example

模式匹配<,任何内容(.+)和>"lazy" quantifier ?会在+找到最短匹配时停止,而不是“贪婪”并寻找最长的匹配(这是默认行为)。没有它,它将一直匹配到最后>,这太过分了。

( )会创建一个子模式,因此虽然$match[0]与整个模式(包括< >)相匹配,但$match[1]只会包含子模式(不包含{ {1}})。

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