我有一个字符串
$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');
你能帮忙写一下这个正则表达式,还是其他更简单的方法?
由于
答案 0 :(得分:4)
preg_replace('/(?<=__)([^.]+)(?=\.)/e','dosomething($1)',$str)
(?<=__) - LookBehind expression to match __
([^.]+) - Actual Match Part - match any characters except dot .
(?=\.) - LookAhead expression to match .
e
中的{p> /e
允许在替换部分中使用php代码,dosomething()可以是任何函数,例如time()
,strtoupper()
,$1
是__
和.
之间的匹配字符串
有关正则表达式的详细信息,请查看regular-expressions.info
答案 1 :(得分:1)
这个正则表达式更简单:
/.*?__(.*?)\..*/
“.*
”=绝对没事。 '?'以下表示不贪婪,这导致.*?
匹配__
“__
”在正则表达式中没有任何意义,因此字面上匹配
“(.*?)
”再次意味着匹配所有内容,但不要贪婪。这将匹配数字
“\.
”我们希望匹配句点字符,但由于它是正则表达式中的重要字符,我们需要将其转义,因此正则表达式引擎知道我们的意思是实际字符而不是“任何东西”
“.*
”匹配任何内容。我们可以在这里贪婪,因为我们已经超越了我们关心的部分
因此...
“.*?__
”匹配数字之前的所有内容,并且
“\..*
”匹配