注意:如果您不想阅读此内容,请检查此注释底部的"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函数,但通常情况下,不要多次循环整个字符串。
太长-未读取版本
- 一位用户评论道"纽约比拉斯维加斯还拥挤"
- 数据库中有一组城市名称。(纽约、拉斯维加斯、莫斯科等)
- 你应该是"大写"的城市名称,在评论中只找到一个"单循环"。(您不会使用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。