Удалить последнюю часть строки после подчеркивания и случайной цифры

Моя строка выглядит так

$img_name = "my_beautiful_picture_123456_789101112131415_16171819202122.jpg"

Какой самый простой способ удалить из первого знака подчеркивания, за которым следует цифра, до конца?

я хотел бы вывести

my_beautiful_picture

Я старался

$img_name = substr($img_name, 0, strpos($img_name, "_"));

а также

$img_name = preg_replace('/_[0-9].*/', '', $img_name);

Но результат my для обоих, я не очень хорошо знаком с регулярными выражениями.

Я получаю желаемый результат с помощью метода preg_replace().

Barmar 30.05.2019 22:08

Второй работает для меня, и я не понимаю, почему он не сработает для вас. Если вы недавно изменили свой код на этот, я подозреваю, что это кеширование, забвение сохранения, загрузка неправильного файла или что-то подобное.

Don't Panic 30.05.2019 22:08

Вы бы получили my, если бы регулярное выражение было /_.*/, но [0-9] гарантирует, что после подчеркивания должна быть цифра.

Barmar 30.05.2019 22:08

У меня нет кэша. Я просто пробую на ideone.com и тот же результат ideone.com/FRJqtw

Rubyx 30.05.2019 22:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
698
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Мы могли бы просто использовать простое выражение с preg_replace или preg_match или preg_match_all:

_[0-9].+

Тестовое задание

$re = '/_[0-9].+/s';
$str = 'my_beautiful_picture_123456_789101112131415_16171819202122.jpg';
$subst = '';

$result = preg_replace($re, $subst, $str);

echo $result;

Выход

my_beautiful_picture

ДЕМО

Цепь регулярных выражений

jex.im визуализирует регулярные выражения:

Эй, @Эмма, это интересно, как ты думаешь, почему это сработало, когда preg_replace, которые они пробовали ранее, не сработало? Я не понимаю, почему + вместо * будет иметь значение. Я должен что-то упустить.

Don't Panic 31.05.2019 00:18

На самом деле, после того, как я прокомментировал здесь, я нашел теорию, основанную на их ссылке ideone под вопросом. Я думаю, что добавлю ответ к своей теории, в основном только потому, что мне любопытно, так ли это, как я думаю. Я не собираюсь соперничать с вашим ответом, который мне кажется идеальным.

Don't Panic 31.05.2019 00:36

Основываясь на коде, который я видел в ссылке ideone, которую вы разместили ранее, у меня есть идея, что могло произойти. Если вы пробовали это раньше:

echo $img_name2 = "my_beautiful_picture_123456_789101112131415_16171819202122.jpg";
echo " | ";
echo $img_name2 = substr($img_name2, 0, strpos($img_name2, "_"));
echo " | ";
echo $img_name2 = preg_replace('/_[0-9].*/', '', $img_name2);

Причина, по которой preg_replaceвыглядит как не сработала, заключается в том, что предыдущая substr уже уменьшила $img_name2 до «мой», прежде чем вы использовали preg_replace на ней. Поскольку «мой» не содержит символов подчеркивания или цифр, это регулярное выражение ничему не соответствовало, поэтому ничего не было заменено, и вы просто получили то же самое «мой».

Это, конечно, настоящая причина. @Rubyx: нет необходимости менять .* на .+

Toto 31.05.2019 09:49

Другие вопросы по теме