Моя строка выглядит так
$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
для обоих, я не очень хорошо знаком с регулярными выражениями.
Второй работает для меня, и я не понимаю, почему он не сработает для вас. Если вы недавно изменили свой код на этот, я подозреваю, что это кеширование, забвение сохранения, загрузка неправильного файла или что-то подобное.
Вы бы получили my
, если бы регулярное выражение было /_.*/
, но [0-9]
гарантирует, что после подчеркивания должна быть цифра.
У меня нет кэша. Я просто пробую на ideone.com и тот же результат ideone.com/FRJqtw
Мы могли бы просто использовать простое выражение с 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
, которые они пробовали ранее, не сработало? Я не понимаю, почему + вместо * будет иметь значение. Я должен что-то упустить.
На самом деле, после того, как я прокомментировал здесь, я нашел теорию, основанную на их ссылке ideone под вопросом. Я думаю, что добавлю ответ к своей теории, в основном только потому, что мне любопытно, так ли это, как я думаю. Я не собираюсь соперничать с вашим ответом, который мне кажется идеальным.
Основываясь на коде, который я видел в ссылке 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: нет необходимости менять .*
на .+
Я получаю желаемый результат с помощью метода
preg_replace()
.