PHP: правильное регулярное выражение для создания каждой буквы слева от первого двоеточия в нижнем регистре - PullRequest
0 голосов
/ 16 декабря 2009
$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 ]

3 голосов
/ 16 декабря 2009

Ваше регулярное выражение должно быть следующим:

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

Разница в символе +?. +? не является жадным, что означает, что он найдет наименьшее количество символов, пока выражение не перейдет к следующему совпадению в выражении, вместо символов MOST до следующего совпадения.

2 голосов
/ 16 декабря 2009

Возможно, вы захотите использовать explode() и implode() вместо регулярного выражения.

$value_a = explode( ':', $value );
$value_a[0] = strtolower( $value_a[0] );
$value = implode( ':', $value_a );
1 голос
/ 16 декабря 2009

Попробуйте ваше регулярное выражение с совпадением

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

Там находится ?, поэтому регулярное выражение не является жадным и захватывает больше, чем следовало.

1 голос
/ 16 декабря 2009
echo preg_replace('~^[^:]+~e', 'strtolower("$0")', $value);
1 голос
/ 16 декабря 2009

Только для информации, эта версия использует 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
1 голос
/ 16 декабря 2009

Попробуйте

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

Работает на примере, который вы разместили, по крайней мере.

...