PHP:更正正则表达式,使第一个冒号小写的每个字母都留下

时间:2009-12-16 16:00:35

标签: php regex preg-replace

$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';

6 个答案:

答案 0 :(得分:3)

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

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

区别在于+?个字符。 +?是非贪婪的,这意味着它将找到最少量的字符,直到表达式移动到表达式中的下一个匹配项,而不是MOST字符,直到下一个匹配。

答案 1 :(得分:2)

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

$value_a = explode( ':', $value );
$value_a[0] = strtolower( $value_a[0] );
$value = implode( ':', $value_a );

答案 2 :(得分:1)

尝试

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

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

答案 3 :(得分: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

答案 4 :(得分:1)

echo preg_replace('~^[^:]+~e', 'strtolower("$0")', $value);

答案 5 :(得分: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";

?就在那里,所以正则表达式并不贪婪,而且抓得比它应该的要多。