2011-04-20 2 views
0

, 나는 다음과 같은 문자열이 있습니다모든 밑줄을 밑줄로 바꾸려면 정규식을 사용하십시오. 나는 도움이 필요

$p__________________________________________________________________________________________________________________________________________, &$s___________________________________________________________________________________________________________________________________________, &$k____________________________________________________________________________________________________________________________________________, &$nft_____________________________________________________________________________________________________________________________________________) 

을 내가로를 설정하는 정규식을 사용할 수 있는지 궁금 해서요 : 기본적으로 모든를 제거하는

$p_, &$s_, &$k_, &$nft_) 

(그래서 그들의 구체적인 금액은 없지만 적어도 1) 진행은 밑줄을 긋고 1 개의 밑줄로 바꿉니다. 더 정확한이기 때문에 다음 사용 (난 항상 올바른 자사의 100 %를 이해할 수 있지만) 그 이유 preg_replace이다 (정규식) preffered된다

preg_replace('#(\$[a-z]{1,3})[_]+#', '$1', $string); 

PS :

나는 다음과 같은 패턴하지만 행운을 시도했습니다 일반적인 문자열 대체 함수.

감사합니다.

+0

$1와 당신이 정말로 원하는 마십시오을 정규식에서 그 일을합니까? 나는 더 쉽고 빠르다고 생각한다. (explode(), while() 또는 string manipulation function) – Mixxiphoid

+2

많은 사람들이 정규 표현식의 성능에 대해 걱정하고 있으므로 몇 가지 벤치 마크가있다. :) 한 번에 한 번에 정규 표현식 함수를 사용하면 성능에 영향을 줄 수는 없으며 다른 문자열 조작자 조합보다 하나의'preg_replace() '가 작성하고 설명하기가 훨씬 쉽습니다. – glomad

답변

5
preg_replace('/_+/', '_', $string); 

생각을 정규식보다 빠릅니다.

+0

'str_replace'는 각 밑줄 시퀀스의 정확한 길이를 알고있는 경우에만 잘 작동합니다. – Geert

+1

정규식을 다음과 같이 조정할 수 있습니다.'preg_replace ('/ __ + /', '_', $ string);'. 이 사소한 편집은 단일 밑줄에 쓸모없는 대체를 방지합니다. – Geert

0

당신은 _을 'str_replace'를 사용하여 공백으로 대체하고 오른쪽 공백을 제거 할 수 있습니다! 문자열의 끝에 _를 추가하십시오. 나는 직접적인 방법을 미안하다! IMO이, 당신은 str_replace()에서 더 나은 성능을 얻을 것 너무 간단 뭔가를

+1

trim은 공백이 아닌 문자와도 잘 맞습니다. – Simon

0

올바른 트랙에 있으며 변수 다음에 _을 잊어 버렸습니다.

당신은 앵커가 필요한 경우 -

$ \ 문자 앵커 : #(\$[a-z]{1,3}_)_+# 편지 앵커

$1과 : #([a-z]_)_+#

$1이있는 모든 앵커 : #((?:^|[^_])_)_+#

관련 문제