#php #strpos
#php #strpos
Вопрос:
Я хочу изменить определенный символ. Но порядок не является точным, и не только первый. Вот примеры переменных:
- 123_456_789.jpg
- 3210_5325_aa.jpg
- 54321-0888_555_1111.jpg
Существует 1000 таких переменных. Я просто хочу изменить все вторые символы «_». Результат должен быть таким:
- 123_456x789.jpg
- 3210_5325xaa.jpg
- 54321-0888_555x1111.jpg
Я пытался substr
и str_replace
, но я не мог понять, как это сделать.
Может кто-нибудь, пожалуйста, показать мне способ добиться этого 🙂
Комментарии:
1. вы пробовали использовать регулярные выражения?
2. Я не очень разбираюсь в php. Я сделал много поисков, но не мог понять, как адаптировать регулярное выражение для моей проблемы.
3. Вам не нужно быть экспертом по PHP, чтобы использовать регулярные выражения, это отдельная технология, которая доступна для использования в большинстве языков программирования. Однако им требуется немного времени, чтобы научиться эффективно их использовать. 🙂
4. Спасибо за подробности 🙂 У меня возникло подозрение, что регулярное выражение происходит из php 🙂 Не могли бы вы прислать мне ссылку на учебник, чтобы лучше понять регулярное выражение?
5. Вы можете ввести «руководство по регулярным выражениям» в Google и найти десятки, а затем выбрать тот, который подходит вам (а не мне)
Ответ №1:
Если второй всегда является последним, вы можете использовать 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
варианты в связи с этим вопросом.
Комментарии:
1. «все вторые «_» символы». В вашем случае вам повезло, что у вас нет 3 символов подчеркивания.
2. @u_mulder Из примера кажется, что второй = последний. Это может быть стандартизированный формат, мы не знаем, откуда берутся имена файлов. Но вы правы, я добавил решение с помощью strpos для реального второго подчеркивания.
3. Большое вам спасибо. Это сработало очень хорошо 🙂
Ответ №2:
Вы можете использовать вложенную операцию поиска / замены:
$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),"_")
Добавьте другие значения и используйте []
обозначения для редактирования строки.
Комментарии:
1. Большое вам спасибо 🙂
Ответ №3:
Один из вариантов — сопоставить только второй символ подчеркивания с помощью шаблона и заменить совпадение на 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
Комментарии:
1. Большое вам спасибо 🙂