Php 加强我的BBCode课程。如何在一个循环中搜索特殊名称?
注意:如果您不想阅读此评论,请检查此评论底部的“TLDR”版本。 我目前有一个基本的BBCode类 当用户发表评论时,他可以使用[item][/item]标记。在[item][/item]标记之间写入的任何内容都会自动转换为32x32px图像,并使用onHover效果通过ajax加载项目状态 例如,您可以做出如下评论: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将自动显示“布甲”
[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函数,但通常情况下,不要多次循环整个字符串
太长-未阅读版本
$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:没错。如果您不介意按字面匹配字符,请使用第一个示例。第二个示例仅当您希望仅匹配单词集合本身时(以单词边界为边界)。