首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析包含自定义条件的纯文本

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

Stack Overflow用户
提问于 2012-08-05 23:48:38
回答 1查看 55关注 0票数 1

我想这是我要找的一种奇怪的东西。

我有以下文本字符串:

代码语言:javascript
运行
复制
$string = "The compass is pointing <north|south|east|west> towards <London|Paris|Rome>";

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

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

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

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

如果有人能帮我开始工作,我会很感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-05 23:59:35

您可以使用preg_replace_callback()来执行选择随机替换的函数。

代码语言:javascript
运行
复制
$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);

http://codepad.viper-7.com/dMG1Yp

该模式与<、any (.+)和>匹配。“懒惰”量词 ?在找到最短匹配时使+停止,而不是“贪婪”地寻找最长的匹配(这是默认行为)。如果没有它,它将一直匹配到最后一个>,这太远了。

( )创建一个子模式,因此虽然$match[0]将是整个模式(包括< >)所匹配的,但$match[1]将只包含子模式(没有< >)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11821095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档