Php 加强我的BBCode课程。如何在一个循环中搜索特殊名称?

Php 加强我的BBCode课程。如何在一个循环中搜索特殊名称?,php,string,algorithm,optimization,replace,Php,String,Algorithm,Optimization,Replace,注意:如果您不想阅读此评论,请检查此评论底部的“TLDR”版本。 我目前有一个基本的BBCode类 当用户发表评论时,他可以使用[item][/item]标记。在[item][/item]标记之间写入的任何内容都会自动转换为32x32px图像,并使用onHover效果通过ajax加载项目状态 例如,您可以做出如下评论: [item]Cloth Armor[/item] [item]Wooden Sword[/item] [item]Iron Shield[/item] PHP将自动显示“布甲”

注意:如果您不想阅读此评论,请检查此评论底部的“TLDR”版本。

我目前有一个基本的BBCode类

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

例如,您可以做出如下评论:

[item]Cloth Armor[/item]
[item]Wooden Sword[/item]
[item]Iron Shield[/item]
PHP将自动显示“布甲”的图像。将此图像悬停时,可以看到有关此项目的其他信息。(例如,它提供了多少防御奖金)

这都是基本的,但是,我不想强迫我的用户使用[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函数,但通常情况下,不要多次循环整个字符串

太长-未阅读版本

  • 一位用户发表了类似“纽约比拉斯维加斯更拥挤”的评论
  • 数据库中有一个城市名称数组。(纽约、拉斯维加斯、莫斯科等)
  • 您应该在注释中找到“大写”的城市名称,并且只有一个“单循环”。(您将不会使用foreach$cities)
  • 我想要一个关于如何在“单循环”中实现这一点的指导或示例。

    非常快

    你可以用它来做你的替代品

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

    请注意,
    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);
    

    .

    你的两个例子都很清楚。请问哪一个能在这样的项目中提供更高的性能和更专业的使用方式?第一个对我来说更容易理解,因为我对正则表达式了解不多,但我想使用正确的、不那么令人头痛的一个:@最后:
    strtr()
    我想速度会更快,但这取决于你是否允许
    mmmWooden-Swordll
    匹配,或者你是否希望它只作为单个单词的集合进行匹配。我想第一个
    '\b'
    =>
    '\b('
    和第二个
    '\b/'
    =>
    )\b/'
    ,否则内心的话就不会检查边界…@Wrikken:哎呀,这就是我在后面加上边界的结果。谢谢。@AnlÜnal:没错。如果您不介意按字面匹配字符,请使用第一个示例。第二个示例仅当您希望仅匹配单词集合本身时(以单词边界为边界)。