Php更改无序变量字符



我想更改一个特定的字符。但顺序并不准确,不仅仅是第一个。以下是可变示例:

  • 123_456_789.jpg
  • 3210_5325_aa.jpg
  • 54321-0888_555_1111.jpg

像这样的变量有1000个。我只想更改所有"_"字符。结果一定是这样的:

  • 123_456x789.jpg
  • 3210_5325xaa.jpg
  • 54321-0888_555x111.jpg

我试过substrstr_replace,但我不知道该怎么做。
有人能告诉我实现这一点的方法吗:(

如果第二个总是最后一个,则可以使用strrpos

<?php
$vals = [
'123_456_789.jpg',
'3210_5325_aa.jpg',
'54321-0888_555_1111.jpg'
];
foreach ($vals as $val) {
$pos = strrpos($val, '_');
echo substr($val, 0, $pos) . 'x' . substr($val, $pos + 1) . '<BR>';
}
// 123_456x789.jpg
// 3210_5325xaa.jpg
// 54321-0888_555x1111.jpg

如果它真的是第二次发生(与实际发生次数无关(,它可能是:

<?php
$vals = [
'123_456_789.jpg',
'3210_5325_aa.jpg',
'54321-0888_555_1111_32.jpg'
];
foreach ($vals as $val) {
$pos = strpos($val, '_'); // 1st '_'
$pos2 = strpos($val, '_', $pos + 1); // 2nd '_'
echo substr($val, 0, $pos2) . 'x' . substr($val, $pos2 + 1) . '<BR>';
}
// 123_456x789.jpg
// 3210_5325xaa.jpg
// 54321-0888_555x1111_32.jpg

第二种变体当然是regex。由于这个问题,我已经向您展示了strpos/strrpos变体。

您可以使用嵌套的搜索/替换操作:

$f=[
'123_456_789.jpg',
'3210_5325_aa.jpg',
'54321-0888_555_1111.jpg',
'____.___'
];
foreach($f as $s) {
$s[strpos($s,"_")+1+strpos(substr($s,strpos($s,"_")+1),"_")]="x";
echo $s.PHP_EOL;
}

输出:

123_456x789.jpg3210_5325xaa.jpg54321-0888_555x1111.jpg_x____

首先,找到第一个下划线的位置:

strpos($s,"_")

从下一个字符中提取字符串的子字符串

substr($s,strpos($s,"_")+1)

并找到下一个下划线的位置

strpos(substr($s,strpos($s,"_")+1),"_")

添加其他值,并使用[]表示法编辑字符串。

Teh游乐场!

一个选项是使用模式只匹配第二个下划线,并将匹配项替换为x

^[^s_]+_[^s_]+K_
  • ^字符串开始
  • [^s_]+_[^s_]+匹配第一个_,后面跟着除_之外的可选字符
  • K_使用K忘记目前匹配的内容,然后匹配_

Regex演示

或者更具体的模式,断言以.jpg结尾

^[^s_]+_[^s_]+K_(?=S*.jpg$)

Regex演示

$re = '/^[^s_]+_[^s_]+K_/m';
$str = '123_456_789.jpg
3210_5325_aa.jpg
54321-0888_555_1111.jpg';
echo preg_replace($re, 'x', $str);

输出

123_456x789.jpg
3210_5325xaa.jpg
54321-0888_555x1111.jpg

最新更新