Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在正则表达式中,如何仅替换相同字符串的某些实例?_Php_Regex_String - Fatal编程技术网

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

Php 在正则表达式中,如何仅替换相同字符串的某些实例?,php,regex,string,Php,Regex,String,基本上我想做的是替换一个文件名 whatever-[xxx]-[xxx].[xxx]变成whatever-150-150.[xxx] 因此,如果我有: aisuihviu123ounsciun-174-345.JPG变为aisuihviu123ounsciun-150-150.JPG 及 wuernichun-123-25.png变为wuernichun-150-150.png 到目前为止,我已经用/(jpg | jpg | jpeg | jpeg | gif | gif | png | png

基本上我想做的是替换一个文件名

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

因此,如果我有:

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

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

到目前为止,我已经用
/(jpg | jpg | jpeg | jpeg | gif | gif | png | png)/

但数字部分确实令人困惑,基本上,文件始终是:

[string]-[2-4个数字]-[2-4个数字][原始文件扩展名]


总有一天我会抽出时间阅读整个正则表达式参考,但这让我感到困惑。

我可能会误解你的问题。。但是
-[\d]+
应该做你想要做的事情。它将匹配一个破折号(-),后跟一个整数。然后你只需要用破折号和150替换它。如果不打算更改扩展名,则不需要匹配扩展名。事实上,除了数字和破折号之外,您不需要匹配任何东西就可以完成所需的任务。

我认为这应该可以做到这一点(假设文件名存储在适当命名的变量中):

我们在这里干什么?让我们看看:

  • 我们将名称的第一部分与
    ([^-]+)
    匹配
  • 然后用
    -
    划一个破折号
  • 然后是一个数字(长度在2到4位之间):
    \d{2,4}
  • 然后是另一个破折号:
    -
  • 然后是另一个数字:
    \d{2,4}
  • 然后是一个文字点:
    \。
  • 然后是文件扩展名(可以是任何文件):
    (.+)

  • 请注意,我们在步骤1和7中使用了捕获组,因此我们可以在替换中使用这些值。学习正则表达式是值得的;他们是一个强大的工具。

    无论谁——我问了这个问题,都应该在问题中发表评论。是的,我觉得这也有点粗鲁。。。谢谢@HeatfanJohn:-)
    preg_replace("/([^-]+)-\d{2,4}-\d{2,4}\.(.+)/i", "$1-150-150.$2", $filename);