#php #mysql #regex
#php #mysql #регулярное выражение
Вопрос:
В моей таблице есть поле, содержащее строку, обозначающую некоторые уровни объектов, например:
"<3<"
"<3<5<"
"<3<5<49<"
и т.д.
У меня есть функция, которая удаляет уровень из такой строки, не зная положения уровня в самой строке. Конкретно, я хотел бы удалить «3». Результат должен быть:
"0"
"<5<"
"<5<49<"
Однако, если я захочу удалить 5, а не 3, результат должен быть таким:
"<3<"
"<3<"
"<3<49<"
Наконец, если я решил удалить 49 вместо 3 или 5, я хотел бы получить это:
"<3<"
"<3<5<"
"<3<5<"
Как вы можете видеть, позиция удаляемой подстроки меняется — иногда это крайняя левая, иногда в середине, иногда крайняя правая. Что важно после всего этого:
- Если число, которое я удаляю, является единственным значением, заключенным в знаки «меньше» (как в «<3<» при удалении 3), новый результат должен быть равен 0.
- Если число, которое я удаляю, не является единственным значением, единственное, что имеет значение, это то, что конечная запись остается неизменной — как и в, вся строка должна оставаться заключенной в символы «меньше», а подстроки из нескольких символов «меньше» в строке не должны встречаться (как в, «3<<5<» не допускается).
Есть ли простой способ регулярных выражений справиться с этим с помощью php и mysql, или я должен просто сделать 3 проверки вручную?
PS Хотя я, возможно, и представил это как таковое, это не домашнее задание, а реальная рабочая проблема.
Комментарии:
1. Я не знаю, какие объекты вы храните в своей базе данных, но структура — это чистый ужас.
2. Это дерево категорий. К сожалению, я не имею права голоса при изменении самой структуры. x Я бы сам пошел с дополнительной таблицей, определяющей эти отношения, но планирование не услышало бы ничего из этого, потому что они хотели, чтобы вся ветвь предмета была сразу распознана без использования count(explode(«<«, $string)) объединения.
Ответ №1:
для каждой строки две замены: (например, вы хотите удалить «3»)
replace "^<3<$" -> "0";
replace "<3" -> "";
Комментарии:
1. Спасибо. Хотя другие ответы технически верны, я хотел получить ответ с регулярным выражением, и я его получил.
Ответ №2:
Вы можете сделать это в 2 шага. Предположим, что ваш ввод таков
"<3<"
"<3<5<"
"<3<5<49<"
и вы хотите удалить номер 3:
Шаг 1. Поскольку значения всегда начинаются с «<«, вы можете попробовать заменить «<3» на «». Затем ввод становится
"<"
"<5<"
"<5<49<"
Шаг 2. Замените строки, которые РАВНЫ «<«, на 0. Тогда вы можете получить
"0"
"<5<"
"<5<49<"
То же самое, если вы хотите удалить 5 или 49.
Я думаю, вы можете легко использовать regex для выполнения этих шагов.
Ответ №3:
На первом шаге:
replace "<3(?=<)"
Важно использовать предварительные просмотры, иначе вы могли бы заменить что-то вроде *<3* 4, а это не то, что вы хотите.
Второй шаг:
replace "^<$" with "0"