在正则表达式中,如何只替换相同字符串的某些实例?

时间:2012-08-24 01:26:48

标签: php regex string

基本上我想做的是替换文件名以便

whatever-[xxx]-[xxx].[xxx]变为whatever-150-150.[xxx]

所以,如果我有:

aisuiuhviu123ounsciun-174-345.JPG变为aisuiuhviu123ounsciun-150-150.JPG

wuernicun-123-25.png变为wuernicun-150-150.png

到目前为止,我已经找到了/(jpg|JPG|jpeg|JPEG|gif|GIF|png|PNG)/

的最后一位(文件扩展名)

但数字部分真的很混乱,基本上文件总是:

[string]-[2-4 numbers]-[2-4 numbers].[original file extension]

有一天,我会到处阅读整个正则表达式的引用,但这让我感到困惑。

2 个答案:

答案 0 :(得分:1)

我可能会误解你的问题......但是-[\d]+应该做你想要的事情。它将匹配短划线( - )后跟整数。然后你只需要用短划线和150替换它。如果你不打算更改它,你不需要匹配扩展。事实上,除了数字和短划线之外,你不需要匹配任何东西来完成你需要的东西。

答案 1 :(得分:1)

我认为这应该可以解决问题(假设文件名存储在适当命名的变量中):

preg_replace("/([^-]+)-\d{2,4}-\d{2,4}\.(.+)/i", "$1-150-150.$2", $filename);

我们在这做什么?我们来看看:

  1. 我们将名称的第一部分与([^-]+)匹配。
  2. 然后点击-
  3. 然后是一个数字(长度在2到4位之间):\d{2,4}
  4. 然后另一个破折号:-
  5. 然后是另一个号码:\d{2,4}
  6. 然后是一个字面点:\.
  7. 然后是文件扩展名(可以是任何内容):(.+)
  8. 请注意,我们在步骤1和7中使用捕获组,以便我们可以在替换中使用这些值。学习正则表达式是值得的;它们是一个强大的工具。