За последние 24 часа нас посетили 22934 программиста и 1224 робота. Сейчас ищут 755 программистов ...

Вырезать все после n вхождений.

Тема в разделе "Регулярные выражения", создана пользователем Rassol2, 9 апр 2020.

Метки:
  1. Rassol2

    Rassol2 Новичок

    С нами с:
    8 июл 2019
    Сообщения:
    31
    Симпатии:
    1
    Здравствуйте.
    Подскажите как составить правило что бы вырезать ненужную часть строки.

    Собственно задача такая.
    Есть строка
    PHP:
    1. $data = "Код товара:{n}004128{n}Производитель:{n}LED SOLUTION{n}Тип лампы{n}P22d{n}Цоколь{n}HB4{n}Напряжение {n}12V{n}Тип св. элемента{n}SMD 3535{n}Количество св. элементов{n}21{n}Обманка (Canbus){n}Нет{n}Драйвер (cтабилизатор напр.){n}Нет{n}Цвет{n}Белый";
    Далее нужно через фунцию
    PHP:
    1. $data = preg_replace("", "", $data);
    Составить выражение которое будет отрезать от строки все что идет после пятого {n}
    Выбрано preg_replace поскольку после какого вхождение вырезать приходит от пользователя и мне показалось что регулярка это то что нужно для такой задачи.

    Но уже битый час не могу найти как составить правило что бы оно брало не первое вхождение, а второе или третье.

    Если если есть предложение как решаются такие задачи то тоже рад буду услышать. Возможно я вообще решаю эту задачу не через то место.

    Заранее спасибо.
     
  2. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    PHP:
    1. $num = 5;
    2. $data = preg_replace('~^(?:.*?\{n\}){'.$num.'}\K.*~s', '', $data);
    Хотя тут вполне достаточно explode, implode.
    PHP:
    1. $data = "Код товара:{n}004128{n}Производитель:{n}LED SOLUTION{n}Тип лампы{n}P22d{n}Цоколь{n}HB4{n}Напряжение {n}12V{n}Тип св. элемента{n}SMD 3535{n}Количество св. элементов{n}21{n}Обманка (Canbus){n}Нет{n}Драйвер (cтабилизатор напр.){n}Нет{n}Цвет{n}Белый";
    2. $num  = 5;
    3. $data = explode('{n}', $data, $num + 1);
    4. print_r($data);
    5. unset($data[$num]);
    6. echo implode('{n}', $data);
     
    miltorg и Rassol2 нравится это.
  3. Rassol2

    Rassol2 Новичок

    С нами с:
    8 июл 2019
    Сообщения:
    31
    Симпатии:
    1
    здравствуйте.
    Почти так и решил через
    PHP:
    1.  $rez = explode('{n}', $data);
    2.   $rez = array_splice($rez, 0,$i);
    3.   $rez = implode('{n}', $rez);
    такой же ответ нашел в интернете , но я не знаю настолько решение через массив правильно.
    Так же в ответах проскакивало что можно использовать регулярные выражения и это кажется более логичным в таком случаи.

    Но как составляется правило в котором можно указать любой совпадения по счету я так и не нашел. А как по мне это довольно интересная возможность и хотелось бы научится.

    Ваш пример с регулярным работает, попробую разобрать его.

    Благодарю !
     
  4. miltorg

    miltorg Активный пользователь

    С нами с:
    7 апр 2019
    Сообщения:
    375
    Симпатии:
    12
    Адрес:
    Калининград
    PHP:
    1. $re = '/^(.*?{n}){5}\K.*/';
    2. $str = 'Код товара:{n}004128{n}Производитель:{n}LED SOLUTION{n}Тип лампы{n}P22d{n}Цоколь{n}HB4{n}Напряжение {n}12V{n}Тип св. элемента{n}SMD 3535{n}Количество св. элементов{n}21{n}Обманка (Canbus){n}Нет{n}Драйвер (cтабилизатор напр.){n}Нет{n}Цвет{n}Белый';
    3.  
    4. print preg_replace($re, '', $str);
     
  5. Rassol2

    Rassol2 Новичок

    С нами с:
    8 июл 2019
    Сообщения:
    31
    Симпатии:
    1
    Коль опять коснулись этой темы.
    Я так и не смог понять что это такое ?
    \K
    Что значит этот оператор ?
     
  6. Emilien

    Emilien Активный пользователь

    С нами с:
    30 июн 2016
    Сообщения:
    246
    Симпатии:
    156
    Rassol2 нравится это.
  7. Rassol2

    Rassol2 Новичок

    С нами с:
    8 июл 2019
    Сообщения:
    31
    Симпатии:
    1