Удалите окончания строк с помощью регулярных выражений и preg_replace

0

Я пытаюсь сделать простую замену. Я пытаюсь понять регулярные выражения, но для меня это похоже на китайский. Я читал http://en.wikipedia.org/wiki/Regular_expression, но, откровенно говоря, это все еще слишком сложно для понимания.

Я получил следующие 6 строк (каждая строка является отдельной переменной):

$sampleArray[] = "Pyromancer 6,52 Pack - 19,99€";
$sampleArray[] = "Dreadnought Pack - 36,99€";
$sampleArray[] = "Citizen Pack - 45,99€";
$sampleArray[] = "Colonies - Pyromancer Pack - ";
$sampleArray[] = "Colonies - Dreadnought Pack - ";
$sampleArray[] = "Colonies - Citizen Pack - ";

foreach($sampleArray as $package_name) {

    $pattern = '/(\s-\s[0-9]+,[0-9]+€)|(\s-\s)$/';
    $package_name = preg_replace($pattern, '', $package_name);
    echo $package_name;
}

В результате я хочу, чтобы часть в конце была удалена:

Pyromancer 6,52 Pack
Dreadnought Pack
Citizen Pack
Colonies - Pyromancer Pack
Colonies - Dreadnought Pack
Colonies - Citizen Pack

То, что я пробовал через пробную версию и ошибку:

$pattern = '([0-9]+,[0-9]+€)';
$package_name = preg_replace($pattern, '', $package_name);

$pattern = '( - )';
$package_name = preg_replace($pattern, '', $package_name);
echo $package_name;

Это, однако, дает мне следующий результат:

Pyromancer 6,52 Pack
Dreadnought Pack
Citizen Pack
ColoniesPyromancer Pack
ColoniesDreadnought Pack
ColoniesCitizen Pack

Кто-нибудь хочет помочь мне указать на последнее, что мне не хватает, чтобы изменить строку в конце?

Также можно поставить это в одну функцию замены вместо того, чтобы проходить через нее несколько раз?

Обновление: я сделал скрипку здесь: http://viper-7.com/1dXwXQ

Теги:
preg-replace

4 ответа

2
Лучший ответ

Это будет работать, чтобы получить все комбинации в одном регулярном выражении: (обновленная форма вашей скрипки)

$pattern = '/(\s-\s[0-9]+,[0-9]+€)|(\s-\s)$/';
$package_name = preg_replace($pattern, '', $package_name);
echo $package_name;

Вот регулярное выражение в действии: http://regex101.com/r/pR6jM9/3

И вот код со скрипты, которую вы указали в комментарии: http://viper-7.com/ZpivYn

Объяснение регулярного выражения:

get '-', затем следуют цифры, за которыми следует символ € или get '-' в конце строки

затем замените его ничем

  • 0
    2 минуты, плохо редактировать регулярное выражение
  • 0
    Я сделал скрипку здесь: viper-7.com/1dXwXQ
Показать ещё 1 комментарий
2

Если я правильно понял ваш вопрос, вы хотите удалить все после последнего - и самого минуса.

Для этого вам не нужно регулярное выражение! Просто определите положение последнего - отрежьте строку в этом положении и примените rtrim() к результату, чтобы избавиться от последних пробелов:

$position     = strrpos($package_name, '-');
$package_name = substr($package_name, 0, $position - 1);
$package_name = rtrim($package_name);

Это гораздо более общий, чем принятый ответ. И вы можете сделать то же самое с регулярным выражением, если хотите:

$pattern = '/\s*-[^-]+$/';
$package_name = preg_replace($pattern, '', $package_name);

Гораздо проще и работать с каждым финалом ваших строк.

  • 2
    Я думаю, что это гораздо более лучший подход. Вам не нужно использовать strpos, а затем substr, но для этого у php есть своя собственная функция: strrchar . Так что это легко сделать с помощью rtrim($package_name, strrchar($package_name, '-'));
  • 0
    Спасибо за добавление к решению.
2

Это моя попытка:

$pattern = '/\s*-\s*([0-9]+(,[0-9]+)?€)?$/';
$package_name = preg_replace($pattern, '', $package_name);

Не уверен, что такое $ package name. Если это многострочный абзац, вы можете использовать preg_replace_all.

Здесь демо:

http://regexr.com/39sev

Вещи, которые он будет соответствовать:

 - 
 - 34€
 - 3500000€
 - 3,39€
 - 3,3999999€

Он не будет соответствовать:

 - ,99€ (nothing before ,)
 - 3, (nothing after ,)
 - 3 (no euro sign)

Изменить: Исправление пробелов (- может иметь несколько пробелов или без пробелов до и после).

  • 0
    Спасибо за добавление к решению.
0

Это должно сделать трюк:

$pattern = '([0-9]+,[0-9]++€)';
$package_name = preg_replace($pattern, '', $package_name);

$package_name = trim($package_name, "-");
echo $package_name;

Используйте trim(), чтобы вырезать последний "-".

  • 0
    Спасибо за добавление к решению. Полезно знать, что trim () доступен в качестве решения для резервного копирования.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню