0
$value='x-Cem-Date:Wed, 16 Dec 2009 15:42:28 GMT';

现在我有:

$value = preg_replace('/(^.+)(?=:)/e', "strtolower('\\1')", $value);

这输出

$value='x-cem-date:wed, 16 dec 2009 15:42:28 GMT';

它应该输出:

$value='x-cem-date:Wed, 16 Dec 2009 15:42:28 GMT';
4

6 回答 6

3

您的正则表达式应如下所示:

/(^.+?)(?=:)/

区别在于+?性格。+?是非贪婪的,这意味着它会在表达式移动到表达式中的下一个匹配之前找到最少数量的字符,而不是在下一个匹配之前找到最多的字符。

于 2009-12-16T16:07:39.847 回答
2

您可以考虑使用explode()andimplode()代替正则表达式。

$value_a = explode( ':', $value );
$value_a[0] = strtolower( $value_a[0] );
$value = implode( ':', $value_a );
于 2009-12-16T16:05:01.440 回答
1
echo preg_replace('~^[^:]+~e', 'strtolower("$0")', $value);
于 2009-12-16T16:12:15.597 回答
1

尝试使用匹配的正则表达式

$value='x-Cem-Date:Wed, 16 Dec 2009 15:42:28 GMT';
$value = preg_match('/(^.+)(?=:)/e', $value, $matches); 
print_r ($matches) . "\n";

这应该输出

Array
(
    [0] => x-Cem-Date:Wed, 16 Dec 2009 15:42
    [1] => x-Cem-Date:Wed, 16 Dec 2009 15:42
)   

试试这个

$value='x-Cem-Date:Wed, 16 Dec 2009 15:42:28 GMT';
$value = preg_replace('/(^.+?:)/e', "strtolower('\\1')", $value);   
echo $value . "\n";

?那里,所以正则表达式并不贪婪,并且比它应该抓取的更多。

于 2009-12-16T16:13:52.343 回答
1

尝试

preg_replace('/([\w-]+?)(:[\w\d\s\:\,]+)/e', "strtolower('\\1') . '\\2'", $value);

它至少适用于您发布的示例。

于 2009-12-16T16:09:10.230 回答
1

仅供参考,这是使用的版本preg_replace_callback

$value='x-Cem-Date:Wed, 16 Dec 2009 15:42:28 GMT';

function callback($text){return(strtolower($text[0]));}

echo preg_replace_callback("/^([^:]+:)/","callback",$value);

输出

x-cem-date:Wed, 16 Dec 2009 15:42:28 GMT
于 2009-12-16T16:09:29.393 回答