Я пытаюсь сделать простую замену. Я пытаюсь понять регулярные выражения, но для меня это похоже на китайский. Я читал 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
Это будет работать, чтобы получить все комбинации в одном регулярном выражении: (обновленная форма вашей скрипки)
$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 '-' в конце строки
затем замените его ничем
Если я правильно понял ваш вопрос, вы хотите удалить все после последнего -
и самого минуса.
Для этого вам не нужно регулярное выражение! Просто определите положение последнего -
отрежьте строку в этом положении и примените 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);
Гораздо проще и работать с каждым финалом ваших строк.
rtrim($package_name, strrchar($package_name, '-'));
Это моя попытка:
$pattern = '/\s*-\s*([0-9]+(,[0-9]+)?€)?$/';
$package_name = preg_replace($pattern, '', $package_name);
Не уверен, что такое $ package name. Если это многострочный абзац, вы можете использовать preg_replace_all.
Здесь демо:
Вещи, которые он будет соответствовать:
-
- 34€
- 3500000€
- 3,39€
- 3,3999999€
Он не будет соответствовать:
- ,99€ (nothing before ,)
- 3, (nothing after ,)
- 3 (no euro sign)
Изменить: Исправление пробелов (- может иметь несколько пробелов или без пробелов до и после).
Это должно сделать трюк:
$pattern = '([0-9]+,[0-9]++€)';
$package_name = preg_replace($pattern, '', $package_name);
$package_name = trim($package_name, "-");
echo $package_name;
Используйте trim(), чтобы вырезать последний "-".