2012-05-11 4 views
2

는 다음과 같은 문자열이 있다고 가정합시다 : Hello... how are you!!?? I'm bored!!PHP - 중복 구두점 제거?

나는 가능한 한 제거 할 백투백 구두점 원하는, 그리고 물음표에 대한 유사한 상황의 경우에 유지하기 위해 "!?". 로 표시한다 필터링 된 문자열은 다음과 같습니다

Hello. how are you? I'm bored!

우수 답변이 문제를 해결하는 가장 간결한 솔루션에 간다. 나는 정규 표현식이 이것을 해결하는 최선의 방법이 될 것으로 기대하지만, 정규 표현식에 대한 나의 지식은 기껏해야 극히 제한적이며, 나는 이것을 해결하는 방법을 모른다. 그러나 나는 비 정규식 솔루션으로는 충분하지 않다. 당신이 제공하는 코드에 대한 설명은 - 악의적으로 단순하지 않은 한 - 또한 좋을 것입니다.

감사합니다.

답변

3
$str = preg_replace('~[?!]{2,}~', '?', preg_replace('~([.,!?])(\\1+)~', '\\1', $str)); 

또는 1 preg_replace 호출 (로 Alix 악셀 덕분에)에

$str = preg_replace(array('~([.,!?])(\\1+)~', '~[?!]{2,}~'), array('\\1', '?'), $str); 

그냥 괄호에의 관심의 모든 문장을 열거

UPD : !? 단지 둥지를 처리하는 것이 다른 정규식으로

무엇을 의미하는지에 대한 설명 :

preg_replace('~([.,!?])(\\1+)~', '\\1', $str) 

표현 ([.,!?])(\\1+) 수단 -이 적어도 하나의 같은 문자 \\1+, \\1 앞에 경우에만 .,!? 중 하나를 찾을 수 - 이전 경기를 참조하고, +at least one입니다.

그리고이 모든 것을 하나의 문자로 바꾸십시오.

외부 표현 [?!]{2,}find all ? or ! if they are at least 2 in a row을 의미하고 preg_replace이다 사용할 수 있습니다 ?

+0

나는이 솔루션이 물음표 문제를 고려하지 않는다고 생각합니다. 편집 - 실제로, 나는 단지 이것을 테스트하고 전혀 작동하지 않습니다. :/ – Nathanael

+0

@ Nathanael Shermett : 오, 그래서'!?'는 항상'?'로 연결되어야합니까? '?!'에 대해서? – zerkms

+0

?! 또한 될 것인가? – Nathanael

1

로 교체 : 중복 제거됩니다

$a="Hello... how are you!!?? Im bored!!!!!!"; echo preg_replace("/([.!?])+/iS","$1",$a); 

=> Hello. how are you? Im bored! 
+0

매력처럼 작동합니다. 그래도 어떻게 설명 할 수 있니? :) – Nathanael

+0

@ Nathanael Shermett : '?!'에 실패합니다. – zerkms

+0

흠, 네 말이 맞아 보이는 군. 그 점을 지적 해 주셔서 감사합니다! – Nathanael

0
$string = "Hello... how are you!!?? I'm bored!!" 
$new_string = $string; 
foreach(array('.',',','?','!') as $value) { 
    $i = ; 
    do { 
    $prev_string = $new_string; 
    $string = str_replace($value . $value,$value,$string; 
    $i++; 
    } while ($string !== $prev_string && $i<100) 
} 

하지만?!?.

이 두 번째 해결책은 "bad_chars"의 첫 번째 상태를 유지하는 것입니다. 마지막으로 보관하려는 경우에도 해결 방법이 있습니다.

<?php 
$string = str_split($string); 
$new_string = array(); 
$i = 0; 
foreach($string as $key => $char) { 
    echo 'Processing: ' . $char . '<br />'; 
    $prev_key = $key - 1; 
    $prev_char = $string[$prev_key]; 
    if($i!== 0) { 
    if(in_array($char,$bad_chars) && in_array($prev_char,$bad_chars)) { 
     // do nothing 
    } else { 
     $new_string[] = $char; 
    } 
    } else { 
    $prev_char = $char; 
    $new_string[] = $prev_char; 
    } 
    $i++; 
} 
$string = implode('',$string); 
$new_string = implode('',$new_string); 
?><br /> 

<?php echo $string; ?><br /> 
<?php echo $new_string; ?><br /> 
+1

정규식을 받아 들여 싸우지 마라! –

+0

작은 메모 : 1 바이트 문자 집합에서만 작동하며 정규식을 사용한 솔루션은 하나의 키 입력으로 해결할 수 있습니다 – zerkms

+0

두 번째 솔루션을 편집했습니다. 이제는 아마 멀티 바이트 안전합니까? 배열 탐색은 매우 빠르지 만 정규 표현식은 매우 느립니다. 복잡한 문자열에서 데이터를 가져 오기 위해 정규 표현식을 사용하지만이 간단한 문제에 대해 이해가되는지 모르겠습니다. 나는 워드 프로세서가 사용하는 것을 궁금해한다. –