ПРИМЕЧАНИЕ. Если вы не хотите читать это, проверьте версию «TLDR» внизу этого комментария.
В настоящее время у меня есть базовый класс BBCode.
Когда пользователь делает комментарий, он может использовать теги [item] [/ item]. Все, что записано между тегами [item] [/ item], автоматически преобразуется в их изображения размером 32x32 пикселей и имеет эффект onHover для загрузки состояния элемента с помощью ajax.
Например, вы можете оставлять комментарии так:
[item]Cloth Armor[/item]
[item]Wooden Sword[/item]
[item]Iron Shield[/item]
PHP автоматически покажет изображение "Cloth Armor". Когда вы наводите курсор на это изображение, вы можете увидеть дополнительную информацию об этом элементе. (например, какой бонус защиты он дает)
Это все просто, однако я не хочу заставлять своих пользователей использовать теги [item] [/ item]. Я хочу преобразовать каждую строку, которая является «именем элемента», для автоматического преобразования.
Допустим, пользователь сделал такой комментарий, не используя BBCodes.
Здравствуйте, моим персонажам нужна защита, поэтому я купил Cloth Armor . Тогда я куплю Деревянный Меч и Железный Щит .
Хорошо, мы можем сделать это разными способами, но я хочу, чтобы это было как можно меньше с помощью шагов НАИМЕНОВАНИЕ.
Например, что-то вроде этого работает, но я не хочу использовать такую функцию:
$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 раз, выполняя поиск и замену каждого элемента по одному, создавая такую огромную и ненужную загрузку.)
Я хочу руководство или пример о том, как это можно сделать в «одном цикле». Он должен начинаться с первой буквы строки. Для любого правильного имени элемента, которое он находит (имена элементов находятся в массиве), он должен вызывать функцию замены, но, как правило, никогда не зацикливать всю строку более одного раза.
Too Long - Версия не прочитана
- Пользователь оставил комментарий типа "Нью-Йорк более многолюден, чем Лас-Вегас".
- У вас есть массив названий городов в базе данных. (Нью-Йорк, Лас-Вегас, Москва и др.)
- Вы должны быть в верхнем регистре названия городов, найденные в комментарии только с "одной петлей". (вы не будете использовать foreach $ городов)
Мне нужны руководство или пример, как это можно сделать в «одном цикле».