2011-07-06 3 views
1

У меня есть две удивительных строк:Использования PHP preg_replace для этого регулярного выражения

my_awesome_string my_awesomestring

Я пытаюсь создать функцию, которая может преобразовать первое подчеркивание в /, если есть второе подчеркивание в строку, но преобразуйте ее в -, если нет второго подчеркивания.

my/awesome-string my-awesomestring

Можете ли вы помочь мне преобразовать мою удивительную строку?

+1

Должно ли это быть сделано с помощью регулярных выражений? Или это может быть что-то еще? – hakre

+0

можно сделать с чем угодно. мой мозг перешел к регулярному выражению, но я полагаю, что это не должно быть ответом –

ответ

3

Другой способ:

$first = strpos($str, '_');   // find first _ 
$last = strrpos($str, '_');   // find last _ 
$str = str_replace('_', '-', $str); // replace all _ with - 
if($first !== $last) {    // more than one _ ? 
    $str[$first] = '/';    // replace first with/
} 
+0

это просто выглядит сексуально. Спасибо Феликс! –

+1

@Dave: Добро пожаловать :) Было весело думать об этом :) –

+0

Хорошее решение. Больше не может голосовать на сегодня :( – hakre

1

Этот пример кода делает то, что вы просили, я нашел его довольно тривиальным, так как есть функция, чтобы подсчитать, как часто строка является частью строки (может быть заменена также функцией подсчета символов). Demo:

<?php 

$strings = array(
    'my_awesome_string', 
    'my_awesomestring' 
); 

function convert_underscore($str) { 
    $c = substr_count($str, '_'); 
    if (!$c) return $str; 
    $pos = strpos($str, '_'); 
    $str = str_replace('_', '-', $str); 
    ($c>1) && $str[$pos] = '/'; 
    return $str; 
} 

print_r(array_map('convert_underscore', $strings)); 
+0

мои строки не будут введены в функцию как массив, а по одному за раз. что именно нужно было бы изменить в этом сценарии? что-нибудь? –

+0

извините, пропустил массив_map внизу –

+0

Я думаю, что ответ, который дал Феликс, немного более изящный, но спасибо, что представил меня на 'substr_count'! –

0

Если я правильно понимаю ваш вопрос, что-то, как это должно работать:

if(substr_count($str, '_') > 1) $str = preg_replace('/_/', '/', $str, 1); 
$str = str_replace('_', '-', $str); 
+0

Вы не можете использовать третий параметр str_replace, чтобы ограничить количество замен. Было бы неплохо, если бы это было, но этого не было;) – hakre

+0

спасибо, что указали это, исправлено – Rob

+0

Вы используете 'str_replace' wrong: http://php.net/manual/en/function.str-replace.php. Четвертый параметр - это переменная, которой будет назначено количество подстановок. Он не может использоваться для * управления * # замен. –

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