Основы регулярных выражений и MySQL — замена переменной части строки

#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<"
  

Как вы можете видеть, позиция удаляемой подстроки меняется — иногда это крайняя левая, иногда в середине, иногда крайняя правая. Что важно после всего этого:

  1. Если число, которое я удаляю, является единственным значением, заключенным в знаки «меньше» (как в «<3<» при удалении 3), новый результат должен быть равен 0.
  2. Если число, которое я удаляю, не является единственным значением, единственное, что имеет значение, это то, что конечная запись остается неизменной — как и в, вся строка должна оставаться заключенной в символы «меньше», а подстроки из нескольких символов «меньше» в строке не должны встречаться (как в, «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"