2012-03-04 5 views
1

잠시 동안 preg_ 함수를 사용하여 놀았습니다. 나는 문자열의 세그먼트를 제거하려고 노력했다. 나는 그들을 꺼내서 함께 모으는 등 행운이 없었다.배열에없는 것을 모두 지우십시오.

허용되는 문자 또는 세그먼트의 배열이 있는데이 배열에없는 문자열에서 아무 것도 제거하기 만하면됩니다. 어떻게 문자열의 구조를 망치지 않고 이것을 할 수 있습니까?

$allowed = array('<', '>', 'p', 'sc'); 
echo clean('<script>'); // <scp> 

보너스 질문 :

이것은 내가 뭘 기대하는 것입니다 내가 UTF-8 aswell 작동하는지 확인 mb_ereg_match를 사용해야합니까?

미리 감사드립니다.

답변

3

[^a-c]과 같은 표현식을 사용하면 모든 문자를 제거 할 수 있습니다. 문자는 a, b, c 이외의 모든 문자와 일치합니다. 문자 시퀀스 (예 : sc)의 경우 이는 물론 작동하지 않습니다.

하지만 캐릭터를 알고 싶다면 게임을 돌릴 수 있습니다.

<?php 
$text = 'hello <script> |world #/foo'; 

$allowed = array('<', '>', 'p', 'sc', '|', '#'); 
array_walk($allowed, function(&$value){ 
    $value = preg_quote($value, '#'); 
}); 
$pattern = '#' . join('|', $allowed) . '#iu'; 

$text = preg_match_all($pattern, $text, $matches); 
$text = join('', $matches[0]); 
echo $text, "\n"; 

보너스 질문 : 당신이 나머지를 무시 유지하려면 무엇을 추출 내가 UTF-8 aswell 작동하는지 확인 mb_ereg_match를 사용해야합니까?

PCRE는 /u 플래그로 UTF-8을 수행 할 수 있습니다. mb_ereg_ *는 후자

foreach ($allowed as &$value) { 
    $value = preg_quote($value, '#'); 
}; 

이다 가

array_walk($allowed, function(&$value){ 
    $value = preg_quote($value, '#'); 
}); 

마찬가지로 잘 될 수 PCRE보다 느리고 UTF-8


ISO-8859-1 이외의 캐릭터 세트를 처리하는 경우에만 사용되어야 아마 조금 빠른 ...

+0

큰 대답! 대괄호를 사용하기 위해 몇 가지 사소한 수정 사항을 추가해야했지만 정확하게 찾고자했습니다. 또한 몇 주 전에 보너스 질문에 대한 답변을 읽어 보았습니다. 얼마나 빨리 잊을 수 있는지 궁금합니다;) – Seralize

+0

'array_walk ($ allowed, 'preg_quote')'에서'preg_quote'를 직접 사용할 수 없습니다. 'array_walk'가 처음에는 값을 전달하고 키는 두번째 매개 변수로 전달하지만'preg_quote'는 두번째 매개 변수가 구분 기호가 될 것으로 예상하기 때문입니다. – Gumbo

+0

당신은 완전히 G 보입니다. 예를 업데이트했습니다. – rodneyrehm

관련 문제