我想更改一个特定的字符。但顺序并不准确,不仅仅是第一个。以下是可变示例:
- 123_456_789.jpg
- 3210_5325_aa.jpg
- 54321-0888_555_1111.jpg
像这样的变量有1000个。我只想更改所有秒"_"字符。结果一定是这样的:
- 123_456x789.jpg
- 3210_5325xaa.jpg
- 54321-0888_555x111.jpg
我试过substr
和str_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