Как разбить и заменить строку? - PullRequest
1 голос
/ 10 марта 2010

У меня есть строка

$str = 'abcde-da__123123213.xef';
$str2 = 'asdfasd__2342352353.gff';
$str3 = 'twethe__3242323423.pig';

Я хочу заменить что-либо после __ (2 подчеркивания) и перед. (точка) с новой строкой (число). Например, вышеприведенный $str изменяется на 'abcde-da__23235239.xef'.

Одним из способов является

$temp = explode('.', $str); 
$temp2 = explode('__', $temp[0]);

и

$new_str = $temp2[0].'__'.time().'.'.$temp[1];

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

я пробовал preg_replace ('/__(.*)/', time (), 'abcde-da__123123213.xef');

Не могли бы вы помочь написать это регулярное выражение или каким-либо другим более простым способом?

Спасибо

Ответы [ 2 ]

4 голосов
/ 10 марта 2010
preg_replace('/(?<=__)([^.]+)(?=\.)/e','dosomething($1)',$str)

(?<=__) - LookBehind expression to match __
([^.]+) - Actual Match Part - match any characters except dot .
(?=\.)  - LookAhead expression to match .

e в /e позволяет использовать php-коды в заменяемой части, dosomething () может быть любой функцией, например, time(), strtoupper(), $1 будет строкой совпадения между __ и .

Для получения дополнительной информации о регулярных выражениях, пожалуйста, взгляните на регулярные выражения.info

1 голос
/ 10 марта 2010

Это регулярное выражение проще: /.*?__(.*?)\..*/

".*" = абсолютно все. '?' то, что следует, означает не быть жадным, что приводит к .*? сопоставлению всего до __

"__" не имеет никакого значения в регулярном выражении, поэтому оно соответствует буквально

"(.*?)" снова означает совпадать со всеми, но не жадничать. Это будет соответствовать номерам

"\." мы хотим сопоставить символ точки, но, поскольку в регулярном выражении он является значимым символом, нам нужно экранировать его, чтобы механизм регулярных выражений знал, что мы имеем в виду действительный символ, а не «что-либо»

".*" соответствует чему угодно. Мы можем быть жадными, потому что мы прошли ту часть, о которой заботимся

Итак ...

".*?__" соответствует всему перед числом, и «\..*» соответствует всему после

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...