2010-07-05 6 views
0

기사를 회전하려고 할 때 도움이 필요합니다. 나는 텍스트를 찾고 대명사 텍스트를 바꾸고 싶습니다.문자열 찾기 및 동일한 케이스 문자열로 바꾸기

예를 들어, 내가 가진 같은 사전 :

안녕 | 안녕하세요 | | 안녕하세요 howd'y

나는 모든 hello을 찾아 hi, howdy 중 하나를 교체 할 필요가

, 또는 howd'y.

안녕, 얘들 아 :

내가 문장이 있다고 가정! 내가 너를 말할 때 나에게 인사하지 않아야하니?

안녕, 얘들 아 : 내 작업 후

는이 같은 될 것입니다! 내가 howdy라고 말할 때 나 한테 어떻게 말해야하지 않아?

여기에서 나는 그 사례를 잃어 버렸다. 나는 그것을 유지하고 싶다! 실제로는 다음과 같아야합니다.

안녕하세요! 내가 HOWDY라고 말할 때 나 한테 어떻게 말하지 않아야하니? 이동 howd'y | | 안녕 | 안녕하세요 |

내 사전의 크기는 약 5000 라인

안녕하세요입니다 올
급여 | 실적 | 임금
안 |되지
해야 .. .

답변

1

I은 ​​(a) 첫 글자가 대문자되지 있는지 매칭 단어를 검사 또는 콜백 함수를 사용 preg_replace_callback 좋을 것 (b) t 첫 번째 문자 만이 대문자로 된 유일한 문자이거나 (c) 첫 번째 문자가 대문자로 된 유일한 문자가 아니며 적절하게 수정 된 대체 단어로 바꿀 수 있습니다.

+0

황색, 답변에 대한 감사합니다. 나는 또한 콜백과 함께 preg_replace를 사용할 필요가 있다고 생각한다.내 str_ireplace가 한 번에 모든 단어의 인스턴스를 대체합니다! 그래서 나는 다른 단어의 적절한 경우를 유지할 수 없다! 하지만 당신이 제안한 3 가지 조건은 내 마음에 먼저있었습니다. :) 그러나 콜백 함수에 대해 생각하지 않았기 때문에 내 솔루션이 작동하지 않을 것입니다. 그래서 당신은 신용을 얻는다 :). – HungryCoder

0

당신은 당신의 문자열을 찾아 두 테스트를 수행 할 수 있습니다

$outputString = 'hi'; 
if ($foundString == ucfirst($foundString)) { 
    $outputString = ucfirst($outputString); 
} else if ($foundString == strtoupper($foundString)) { 
    $outputString = strtoupper($outputString); 
} else { 
    // do not modify string's case 
} 
+0

네, 이것은 내가 무엇을 할 계획인지 알려주는 것입니다. 어떻게 다를 수 있습니다! :). 그러나 귀하의 의견은 확실히 도움이 될 것입니다. 시간 내 주셔서 대단히 감사합니다! – HungryCoder

0

여기 (상하 또는 대문자) 케이스를 유지하는 솔루션입니다 :

// Assumes $replace is already lowercase 
function convertCase($find, $replace) { 
    if (ctype_upper($find) === true) 
    return strtoupper($replace); 
    else if (ctype_upper($find[0]) === true) 
    return ucfirst($replace); 
    else 
    return $replace; 
} 

$find = 'hello'; 
$replace = 'hi'; 

// Find the word in all cases that it occurs in 
while (($pos = stripos($input, $find)) !== false) { 
    // Extract the word in its current case 
    $found = substr($input, $pos, strlen($find)); 

    // Replace all occurrences of this case 
    $input = str_replace($found, convertCase($found, $replace), $input); 
} 
+0

입력 해 주셔서 감사합니다! – HungryCoder

0

당신은 다음과 같은 기능을 시도 할 수 있습니다. 유용한 문자 인 properties of ASCII upper and lower case letters을 사용하기 때문에 ASCII 문자열에서만 작동한다는 점에 유의하십시오. 그러나, 그것은 매우 빠르게해야한다 :

function preserve_case($old, $new) { 
    $mask = strtoupper($old)^$old; 
    return strtoupper($new) | $mask . 
     str_repeat(substr($mask, -1), strlen($new) - strlen($old)); 
} 

echo preserve_case('Upper', 'lowercase'); 
// Lowercase 

echo preserve_case('HELLO', 'howdy'); 
// HOWDY 

echo preserve_case('lower case', 'UPPER CASE'); 
// upper case 

echo preserve_case('HELLO', "howd'y"); 
// HOWD'Y 

이 영리한 작은 펄 기능의 내 PHP 버전입니다 :

How do I substitute case insensitively on the LHS while preserving case on the RHS?

+0

입력 해 주셔서 감사합니다. – HungryCoder

+0

나는 그것을 사용할 수 있다고 생각한다! 내 주제는 ASCII뿐입니다! 그래서 문제가되지 않습니다! – HungryCoder

관련 문제