如何拆分和替换字符串?

时间:2010-03-10 12:59:28

标签: php regex

我有一个字符串

$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 个答案:

答案 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)

这个正则表达式更简单: /.*?__(.*?)\..*/

.*”=绝对没事。 '?'以下表示不贪婪,这导致.*?匹配__

之前的所有内容

__”在正则表达式中没有任何意义,因此字面上匹配

(.*?)”再次意味着匹配所有内容,但不要贪婪。这将匹配数字

\.”我们希望匹配句点字符,但由于它是正则表达式中的重要字符,我们需要将其转义,因此正则表达式引擎知道我们的意思是实际字符而不是“任何东西”

.*”匹配任何内容。我们可以在这里贪婪,因为我们已经超越了我们关心的部分

因此...

.*?__”匹配数字之前的所有内容,并且 “\..*”匹配

之后的所有内容