增强我的BBCode课程.如何在一个循环中搜索特殊名称


Enhancing my BBCode class. How to search for special names in one loop?

注意:如果您不想阅读此内容,请检查此注释底部的"TLDR"版本

我目前有一个基本的BBCode类。

当用户发表评论时,他可以使用[item][/item]标记。在[item][/item]标记之间写入的任何内容都会自动转换为其32x32px图像,并通过onHover效果使用ajax加载项目状态。

例如,你可以这样评论:

[item]Cloth Armor[/item]
[item]Wooden Sword[/item]
[item]Iron Shield[/item]

PHP将自动显示"Cloth Armor"的图像。当您悬停此图像时,您可以看到有关此项目的其他信息。(例如给予多少防御奖励)

这都是基本的,但是,我不想强迫我的用户使用[item][/item]标签。我想转换每一个字符串,这是一个"项目名称"要自动转换。

比方说,用户在没有使用BBCodes的情况下发表了这样的评论。

你好,我的角色需要一些防御,所以我买了一件布甲。然后,我将购买木剑铁盾

好吧,我们可以用很多方法来做到这一点,但我想用尽可能少的步骤来完成。

例如,像这样的东西可以工作,但我不想使用这样的功能:

$itemsArray = array('Iron Shield', 'Wooden Sword', 'Cloth Armor');
$comment = $_POST['comment'];
foreach($itemsArray as $k => $v)
{
      str_replace($v, "onHoverEffect:$v", $comment);
}
echo $comment;

这个脚本会循环字符串无数次。(实际上,数据库中有300多个项目,因此它会循环300次,逐个搜索和替换每个项目,从而产生如此巨大和不必要的负载。)

我想要一个关于如何在"单循环"中完成这项工作的指导或示例。它应该从字符串的第一个字母开始。对于他找到的任何正确的项名称(项名称在数组中),它应该调用replace函数,但通常情况下,不要多次循环整个字符串。

太长-未读取版本

  1. 一位用户评论道"纽约比拉斯维加斯还拥挤"
  2. 数据库中有一组城市名称。(纽约、拉斯维加斯、莫斯科等)
  3. 你应该是"大写"的城市名称,在评论中只找到一个"单循环"。(您不会使用foreach$cities)

我想要一个关于如何在"单循环"中完成这项工作的指导或示例。

strtr()非常快。

你可以用它来做替代品。

$items = array('Iron Shield', 'Wooden Sword', 'Cloth Armor');
$itemsReplacements = array();
foreach($items as $item) {
    $itemsReplacements[$item] = 'onHoverEffect:' . $item;
}
$str = strtr($str, $itemsReplacements);

CodePad。

注意,strtr()不会单独区分单词或字符分组。如果你想让单词独立,你必须使用一个有单词边界的正则表达式('b)或滚动类似的东西。

$items = array('Iron Shield', 'Wooden Sword', 'Cloth Armor');
$str = preg_replace('/'b(' . implode('|', array_map('preg_quote', $items, array_fill(0, count($items), '/')))  . ')'b/', 'onHoverEffect:$0', $str);

CodePad。