Php 改变无序可变字符

Php change unordered variable character

我想改变一个特定的角色。但顺序不准确,不仅是第一个。 这是变量示例:

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

我试过 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

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

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

^[^\s_]+_[^\s_]+\K_
  • ^ 字符串开头
  • [^\s_]+_[^\s_]+ 匹配第一个 _ 和后跟 _
  • 以外的可选字符
  • \K_ 忘记到目前为止使用 \K 匹配的内容,然后匹配 _ 其中

Regex demo

或更具体的模式和断言以 .jpg

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

Regex demo

$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

您可以使用嵌套 search/replace 操作:

$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.jpg
3210_5325xaa.jpg
54321-0888_555x1111.jpg
_x__.___

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

strpos($s,"_")

从下一个字符开始取字符串的子串

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

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

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

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

Teh Playground!