使用regex和preg_replace删除字符串结尾

时间:2014-11-09 12:52:04

标签: php regex preg-replace

我正在尝试做一个简单的替换。我试着理解正则表达式,但它对我来说就像中文。我读过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

4 个答案:

答案 0 :(得分: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

正则表达式的解释:

得到' - '接下来是数字,接着是符号 要么 得到' - '在一行

然后将其替换为

答案 1 :(得分:2)

这是我的尝试:

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

不确定$ package名称是什么。如果它是多行段落,那么您可以使用preg_replace_all。

这是演示:

http://regexr.com/39sev

它将匹配的东西:

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

它不匹配:

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

编辑:空格修复( - 前后可以有多个或没有空格。)

答案 2 :(得分: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);

更简单,并且可以处理字符串的每个结尾..

答案 3 :(得分:0)

这应该可以解决问题:

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

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

使用trim()删除最后一个“ - ”。