2012-03-26 4 views
1

У меня есть строка: «Some_string_to_capitalize», которую я хотел бы преобразовать в «Some_String_To_Capitalize». Я пробовал:Как сделать preg_replace захватывать прописные буквы (php)?

$result = preg_replace('/(_([a-z]{1}))/' , strtoupper('$1') , $subject ) 

и

$result = preg_replace('/(_([a-z]{1}))/' , "strtoupper($1)" , $subject ) 

Я смотрел на страницу PHP человек и здесь на SO, но ничего не нашел. Извиняюсь, если это дура!

This is the equivalent SO question for Javascript.

ответ

6

Я думаю, что вы хотите использовать preg_replace_callback:

В PHP 5.3+

<?php 
$subject = 'Some_string_to_capitalize'; 
$result = preg_replace_callback(
    '/(_([a-z]{1}))/', 
    function ($matches) { 
     return strtoupper($matches[0]); 
    } , 
    $subject 
); 

Для PHP ниже 5.3

function toUppper($matches) { 
    return strtoupper($matches[0]); 
} 

$result = preg_replace_callback('/(_([a-z]{1}))/', 'toUpper', $subject); 
+0

+1 Говард ответил первым, поэтому я дал принять его, но это также был чрезвычайно информативный ответ. Благодаря! – AndyPerlitch

+1

Это не о том, кто отвечает первым, речь идет о том, хорошо ли ответ. Модификатор/e не является хорошей идеей. Это может быть опасно, теперь оно устарело и в какой-то момент будет удалено из PHP. –

+0

@ Josh Davis Я сделал несколько поисковых запросов, и вы абсолютно правы в вопросах безопасности. В то время, когда я принял ответ Говарда, я не увидел никакого явного преимущества между ним и Дэвидом. Спасибо что подметил это. – AndyPerlitch

1

Попробуйте добавить к вашему регулярному выражению букву «e» (что означает eval) в качестве модификатора.

$result = preg_replace("/(_([a-z]{1}))/e" , "strtoupper(\\1)" , $subject); 
+0

Awesome. Одна вещь, которую вы забыли, заключалась в одиночных кавычках вокруг \\ 1. Пытался отредактировать, а SO отказался ... попытался принять ваш ответ, и я сказал, что могу через 4 минуты. Являются ли эти меры новыми? – AndyPerlitch

+0

Я думаю, что \\ 1 нужно процитировать для этого. –

+0

Он работает с двойными кавычками в моей тестовой среде php. – Howard

1

Я думаю, что вы хотите ucfirst не strtoupper. Это будет использовать только первую букву каждого матча, а не весь матч, как strtoupper will. Я также думаю, что вам нужно переключиться на preg_replace_callback, потому что ваш текущий синтаксис говорит php запускать strtoupper в строке «$ 1» (что ничего не делает), а затем передать это как заменяющую строку, используемую для ВСЕХ совпадений сделал. Это даст вам тот же результат, что и вход.

Попробуйте вместо этого:

<?php 
preg_replace_callback(
    '/(_([a-z]{1}))/', 
    create_function(
     // single quotes are essential here, 
     // or alternative escape all $ as \$ 
     '$matches', 
     'return ucfirst($matches[0]);' 
    ), 
    $subject 
); 
?> 
+0

+1 по той же причине, что и комментарий к ответу @David Stockton. Спасибо! – AndyPerlitch

+0

ps на самом деле картина у меня только фиксирует подчеркивание и первую букву, поэтому мне не нужно ucfirst – AndyPerlitch

+0

Ах да, я действительно не смотрел на regex lol, но я вижу это сейчас: P – Brian

1

Вы у меня есть хорошие ответы опубликованные до сих пор; Однако, я думал, что опубликовать изменения только для пинков:

[обновлено] отредактированный код пропущено более лаконична:

<?php 

$string = 'Some_strIng_to_caPitÃliZe'; 
echo mb_convert_case($string, MB_CASE_TITLE, 'UTF-8'); 
// Some_String_To_Capitãlize 

Приведенный выше код считает следующее:

  1. Юникодовые символы могут быть частью строки; в этом случае, 'UTF-8' должен быть безопасным кодирования:

  2. mb_convert_case с помощью флага MB_CASE_TITLE ухаживает слова, которые приходят в со смешанным случае, так что нам не нужно вручную нормализовать и «_» считается слово boundry.

  3. mb_convert_case функция работает с PHP версии, так как 4.3.0

PHP Source для справки.

Смежные вопросы