Php 改变无序可变字符
Php change unordered variable character
我想改变一个特定的角色。但顺序不准确,不仅是第一个。
这是变量示例:
- 123_456_789.jpg
- 3210_5325_aa.jpg
- 54321-0888_555_1111.jpg
这样的变量有1000个。我只想更改所有 second 个“_”字符。结果一定是这样的:
- 123_456x789.jpg
- 3210_5325xaa.jpg
- 54321-0888_555x1111.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
第二种变体当然是正则表达式。由于这个问题,我已经向您展示了 strpos/strrpos
个变体。
一个选项是使用模式仅匹配第二个下划线并将匹配替换为 x
^[^\s_]+_[^\s_]+\K_
^
字符串开头
[^\s_]+_[^\s_]+
匹配第一个 _
和后跟 _
以外的可选字符
\K_
忘记到目前为止使用 \K
匹配的内容,然后匹配 _
其中
或更具体的模式和断言以 .jpg
结尾
^[^\s_]+_[^\s_]+\K_(?=\S*\.jpg$)
$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),"_")
添加其他值,并使用 []
符号编辑字符串。
我想改变一个特定的角色。但顺序不准确,不仅是第一个。 这是变量示例:
- 123_456_789.jpg
- 3210_5325_aa.jpg
- 54321-0888_555_1111.jpg
这样的变量有1000个。我只想更改所有 second 个“_”字符。结果一定是这样的:
- 123_456x789.jpg
- 3210_5325xaa.jpg
- 54321-0888_555x1111.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
第二种变体当然是正则表达式。由于这个问题,我已经向您展示了 strpos/strrpos
个变体。
一个选项是使用模式仅匹配第二个下划线并将匹配替换为 x
^[^\s_]+_[^\s_]+\K_
^
字符串开头[^\s_]+_[^\s_]+
匹配第一个_
和后跟_
以外的可选字符
\K_
忘记到目前为止使用\K
匹配的内容,然后匹配_
其中
或更具体的模式和断言以 .jpg
^[^\s_]+_[^\s_]+\K_(?=\S*\.jpg$)
$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),"_")
添加其他值,并使用 []
符号编辑字符串。