如何创建正则表达式组以进行替换?

时间:2011-01-13 02:43:41

标签: php regex preg-replace regex-group

我有这个示例字符串:

Image:  SGD$45.32 SKU: 3f3f3 dfdfd grg4t BP 6yhf Pack Size: 1000's Color: Green Price: SGD$45.32 SGD$45...

我想删除所有价格:

SGD$45.32  
Price: SGD$45.32  
SGD$45  

我有这个表达应该匹配3组:

$pattern = '/(Price.+\sSGD\$\d+\.\d{2})(SGD\$\d+\.\d{2})(SGD\$\d+)/';  
$new_snippet = preg_replace($pattern, '', $snippet); 

但显然它不起作用。

如果我一次更换一个组,它就有效。但是,我想知道是否可以用一个语句替换所有可能的匹配组。

尝试preg_match_all($pattern, $snippet, $matches);根据上述模式显示匹配项,但如果我将所有3个组合在一起,则找不到匹配项。

3 个答案:

答案 0 :(得分:2)

要回答您的具体问题:使用|对其进行有条理的分组:

$pattern = '/(Price.+\sSGD\$\d+\.\d{2})|(SGD\$\d+\.\d{2})|(SGD\$\d+)/';  

如果匹配任何

,则替换子字符串
  • (Price.+\sSGD\$\d+\.\d{2})
  • (SGD\$\d+\.\d{2})
  • (SGD\$\d+)

我会将整个正则表达式重写为:

$pattern = '/(?:Price.+\s*)?SGD\$\d+(?:\.\d{2})?/';  

这也会取代Price: SGD$45的出现次数。

答案 1 :(得分:2)

试试这个:

$output = preg_replace(array('/Price: /s', '/SGD\$.+? /s'), '', $input);

答案 2 :(得分:0)

你试过用|分开吗?