Php изменить неупорядоченный символ переменной

#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. Большое вам спасибо 🙂