2013-08-19 3 views
0

Я очень спутать с preg_replace, у меня есть эта строка, и я хотел бы изменить только номер перед _Некоторая путаница с preg_replace

$string = 'string/1_491107.jpg'; 
$newstring = preg_replace('#([0-9]+)_#', '666', $string); 

Но тогда я получаю «строку/666491107.jpg» вместо " строка/666_491107.jpg»

Благодаря

ответ

3

Что вы делаете здесь соответствующие цифры в скобках, как $1 в вашей замены. Вы на самом деле не говорите: «нужно заменить только материал в скобках».

Вы можете сделать это следующим образом:

$string = 'string/1_491107.jpg'; 
$newstring = preg_replace('#[0-9]+_#', '666_', $string); 

или вы могли бы использовать positive lookahead (только соответствует последовательность чисел, за которой следует символ подчеркивания, но не включают подчеркивание в матче):

$string = 'string/1_491107.jpg'; 
$newstring = preg_replace('#[0-9]+(?=_)#', '666', $string); 

Regex 101 demo

+0

Да, это именно то, что я ищу. – Tahola

+1

+1 для очень аккуратного решения. Ясно, что мои навыки регулярных выражений ржавые. – andrewsi

+0

@andrewsi В правильных ситуациях негативные/позитивные взгляды/задержек являются удивительными и определенно важными для понимания. – h2ooooooo

3

у вас есть подчеркивание как часть текста, который будет заменен; так что вы также должны включить его в замене:

$string = 'string/1_491107.jpg'; 
$newstring = preg_replace('#([0-9]+)_#', '666_', $string); 
+0

Да я это сделал, но есть другой способ (с другой функцией возможно), чтобы сделать это witout включают подчеркивание? – Tahola

+0

Вам нужен знак подчеркивания в поиске, чтобы остановить его соответствие другим номерам - есть ли в вашем исходном 'string /' числа? – andrewsi

+0

У меня есть много строк и много разных шаблонов и 1 функция для всех, поэтому в идеальном случае сделка с подчеркиванием лучше для меня, «h2ooooooo» даст мне дорогу. Спасибо вам обоим. – Tahola

Смежные вопросы