2013-07-31 2 views
1

많은 결과가 발견되었지만 어떤 이유로 든 저에게 맞지 않습니다! 나는 preg_replace을 정규식과 함께 시도했으나 html_entity_decode,하지만 좋지는 않습니다.PHP의 문자열에서 특수 HTML 문자를 제거하십시오.

예를 들어 해시 기호가있는 단어를 선택하고 싶습니다. 예 : #WORD, 잘 작동하지만 때로는 해시 표시가 ‏#WORD으로 읽히고 누락됩니다.

예 : This is a normal #hash_mark but ‏#this_isn't

가 나타나는 : enter image description here

내가 중복으로 표시된 질문에 해시 마크 접두사 '~(?<=\s|^)#[^\s#]++~um'


와 단어를 선택하는 데 사용하는 정규식은 이미지에서 볼 수 있듯이 유니 코드 텍스트의 경우 대답이 작동하지 않습니다. enter image description here


코드는 무엇을 필요있어하는 것은 정상적인 #

function remove_special_char($sentence){  
    return preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s','',$sentence);     
} 

echo remove_special_char("hello مرحبا привет שלום"); 

출력으로 &rlm;#를 교체 아니라 유니 코드 텍스트를 포함한 모든 특수 문자를 제거하지 :

두 개의 서로 다른 문자
hello 
+0

음 ... 당신의 정규식 해시 * 공백 앞에 * 일치에서 촬영되었습니다

preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $str1); 

다음의 정규식을 사용했다. 그 해시는 공백으로 시작하지 않습니다. 그럴까요? 정규식이 다른 것과 일치해야합니까? – deceze

+0

'~ (? <= \ s |^| ‏) # [^ \ s #] ++ ~ um''과 같은 긍정적 인 룩백 어설 션에 오른쪽에서 왼쪽으로 마커를 추가 할 수 있습니다. – Phylogenesis

+0

@Phylogenesis 해결책은 동일하지만 그가 만난 문제는 육안으로 인식하기가 다소 어려웠습니다. 이러한 문자는 동일한 시각적으로 렌더링 되었기 때문입니다. –

답변

1

이 있었다 special_characters enter image description here

당신은 내가 어떤 디버그

을했습니다 정확히 무슨 일이 있었는지 살펴 보자
 var_dump(ord('‏#')); //return ASCII value of this char 
     $str1 = 'This is character 226 ‏#'; 

     $str1v1 = preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $str1); 

     var_dump(ord('#')); //return ASCII value of second char 
     $str2 = "This is character 35 #"; 

     $str2v1 = preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $str2); 


     var_dump($str1v1); 
     var_dump($str2v1); 

     var_dump($str1); 
     var_dump($str2); 

출력 :

int 226 
int 35 
string 'This is character 226 ' (length=22) 
string 'This is character 35 ' (length=21) 
string 'This is character 226 â€#' (length=26) 
string 'This is character 35 #' (length=22) 

어쩌면 당신이나 당신의 최종 사용자가 복사 곳에 붙여 짓을하고 같은 변환 charCode 값을 포함 무엇 당신은 (&rlm;#)라고 설명했습니다. 그것들은 같은 표면이되어 혼란스럽게 만듭니다.

그 문자에서 탈출하기 위해, 나는 라인을 정규식은 PHP remove special character from string

+3

약간의 혼란이있을 수 있습니다. 우하 표식 (U + 200F)의 UTF-8 인코딩은 3 바이트 '0xE2 0x80 0x8F'입니다. PHP는 내부 유니 코드 처리 기능이 없기 때문에 표준 문자열 함수는 문자가 아닌 바이트를 처리합니다.ord() 함수는 매개 변수로 제공된 문자열의 첫 번째 바이트 값을 반환합니다.이 경우 226입니다. – Phylogenesis

+0

알아두면 좋을 것입니다. 네가 여기서 준 이유를 정확히 알지 못했다. 감사합니다 –

+0

매우 유용한 정보,하지만 그 정규식은 비 유니 코드 문자에서만 작동하는 것으로 보이고, 다른 경우에는 모든 문자를 엉망으로 만듭니다. – Khaled

관련 문제