2010-12-15 8 views
3

문자열에서 모든 단어를 배열로 추출하려고하는데 공백 ( )에 문제가 있습니다.PHP에서 문자열에서 단어를 추출하는 중 문제가 발생했습니다.

//Clean data to text only 
$data = strip_tags($data); 
$data = htmlentities($data, ENT_QUOTES, 'UTF-8'); 
$data = html_entity_decode($data, ENT_QUOTES, 'UTF-8'); 
$data = htmlspecialchars_decode($data); 
$data = mb_strtolower($data, 'UTF-8'); 

//Clean up text from special chrs I don't want as words 
$data = str_replace(',', '', $data); 
$data = str_replace('.', '', $data); 
$data = str_replace(':', '', $data); 
$data = str_replace(';', '', $data); 
$data = str_replace('*', '', $data); 
$data = str_replace('?', '', $data); 
$data = str_replace('!', '', $data); 
$data = str_replace('-', ' ', $data); 
$data = str_replace("\n", ' ', $data); 
$data = str_replace("\r", ' ', $data); 
$data = str_replace("\t", ' ', $data); 
$data = str_replace("\0", ' ', $data); 
$data = str_replace("\x0B", ' ', $data); 
$data = str_replace(" ", ' ', $data); 

//Clean up duplicated spaces 
do { 
    $data = str_replace(' ', ' ', $data); 
} while(strpos($data, ' ') !== false); 

//Make array 
$clean_data = explode(' ', $data); 

echo "<pre>"; 
var_dump($clean_data); 
echo "</pre>"; 

이 출력 :

array(58) { 
    [0]=> 
    string(5) " " 
    [1]=> 
    string(5) " " 
    [2]=> 
    string(11) "anläggning" 
    [3]=> 
    string(3) "med" 
    [4]=> 
    string(3) "den" 
    [5]=> 
    string(10) "erfarenhet" 
    [6]=> 
    string(3) "som" 
} 

가 나는 제 2 개 배열 값 &nbsp; 것을 알 출력 소스를 선택하면

이것은 I하는 일이다.
아무리 시도해도 문자열에서이를 제거 할 수 없습니다. 어떤 아이디어? 내가 관리 코드를 일부 조정 후
출력 다음 얻을 :

UPDATE가

array(56) { 
    [0]=> 
    string(1) "�" //Notice change. Instead of string length 5 it now says 1. But still its garbage. 
    [1]=> 
    string(1) "�" 
    [2]=> 
    string(11) "anläggning" 
    [3]=> 
    string(3) "med" 
    [4]=> 
    string(3) "den" 
    [5]=> 
    string(10) "erfarenhet" 
    [6]=> 
    string(3) "som" 
    [7]=> 
    string(5) "finns" 
    [8]=> 
    string(4) "inom" 

감사합니다! (게으른 사람을위한)

답변 :

심지어 네가이 문제에 대한 약간 다른 접근 방식이다, 나는 (남은 &nbsp; 및 기타 추가 이상한처럼 위에서했던 문제가 있었다 이유는 정말 응답하지 않는다 공백), 나는 그것을 좋아하고 내 원래 코드보다 훨씬 낫다.

누구에게 감사드립니다!

//Clean data to text only 
$data = strip_tags($data); 
$data = html_entity_decode($data, ENT_QUOTES, 'UTF-8'); 
$data = htmlspecialchars_decode($data); 
$data = mb_strtolower($data, 'UTF-8'); 

//Clean up text from special chrs 
$data = str_replace(array("-"), ' ', $data);  

$clean_data = str_word_count($data, 1, 'äöå'); 

echo "<pre>"; 
var_dump($clean_data); 
echo "</pre>"; 
+0

하면 실제 데이터가   (위해서 var_dump에 의해 생성뿐만 아니라 출력) 포함되어 있는지? – JohnSmith

+0

누군가 약 6 줄에서 똑같은 일을하는 버전을 게시 할 것입니다. – thirtydot

+0

JohnSmith : 예. echo $ data [0] 또는 echo $ data [1]을 수행하면 동일하게됩니다. – jamietelin

답변

2

좋아, 당신이해야 할 유일한 것은 당신이 이미 문자열이 정말 아직 데이터가하는 있는지 확인 &nbsp; 체크 @Andy E's answer 포함 된 경우에만 (처럼 공백으로 &nbsp;을 대체하는 것입니다 되지 않은 HTML 엔티티를 포함).

$words = str_word_count($data, 1, 'äöåÄÖÅ'); 
:

$data = str_replace("&nbsp;", ' ', $data); 

그런 다음 당신은 단어를 얻을 str_word_count을 사용할 수 있습니다

P.S. : htmlentities을 먼저 호출 한 다음 html_entity_decode으로 다시 되 돌리면 어떻습니까?

업데이트 : 예 :

$str = '  anläggning med den  erfahrenhet som åååÅ ÅÅ'; 
print_r(str_word_count($str, 1, 'äöåÄÖÅ')); 

인쇄

Array 
(
    [0] => anläggning 
    [1] => med 
    [2] => den 
    [3] => erfahrenhet 
    [4] => som 
    [5] => åååÅ 
    [6] => ÅÅ 
) 

읽기 문서는 데 도움이 :)

+0

불행히도 str_word_count는 åäö와 호환되지 않습니다. å, ä 또는 ö에 닿으면 모든 단어를 두 단어로 잘라냅니다. – jamietelin

+0

커스텀'$ charlist'를'str_word_count'의 세 번째 인수로 전달할 수 있습니다 - " 'word'로 간주 될 추가 문자 목록" – thirtydot

+0

@jamietelin : @thirthdot은 말하기를 여분의 문자가있는 문자열을 전달합니다 그 단어의 일부로 간주되어야합니다. 그것은 제가 링크 된 문서에 설명되어 있습니다. 나를 믿으십시오, 설명서를 읽는 것이 도움이됩니다! –

0
$data = '&nbsp; cesadasdsadas <br /> &nbsp; dsadsadas'; 
$data = preg_replace('/&nbsp;/', ' ', $data); 
var_dump($data); 
+0

아무런 차이가 없습니다./ – jamietelin

+0

시험을 치고 저에게 효과가 있습니다 –

1

대신에 :

14x str_replace 

do { 
    $data = str_replace(' ', ' ', $data); 
} while(strpos($data, ' ') !== false); 

가 수행 0xC2A0 반면

$data = preg_replace('/[.*,:;?!]/', '', $data); 
$data = preg_replace('/(?:\xC2\xA0|\s{2,}|-)/', ' ', $data); 

비 분리 공백 (&nbsp;)와 \s입니다 반복 str_replace 호출을 포함하는 임의의 공백 문자입니다.

+0

이것은 실제로 뭔가를했습니다. 그러나 공간 대신, 나는 여기에 게시 할 수없는 이상한 성격을 보인다. – jamietelin

+1

"이상한 문자"가 "0xC2"입니까? –

+0

goreSplatter : 지금 당신에게 키스하고 싶습니다! 나는 "당신의 캐릭터"'$ data = str_replace (array ("\ xC2"), '', $ data);를 테스트했다. 도대체 그 캐릭터는'0xC2'입니까?! – jamietelin

2

문자열의 기존 &nbsp; 부분을 "이중 인코딩"할 수 있습니까? html_entity_decode 전에 문자열에 htmlentities을 호출하면 기존 &nbsp; 문자는 모두 &amp;nbsp;이됩니다. 네 번째 매개 변수로 false을 제공하여 htmlentities이 이중 인코딩되지 않도록 할 수 있습니다.

$data = str_replace(array(',','.',':',';','*','?','!','-'), '', $data); 
0

어쩌면 당신이 시도해야합니다 : 당신이 str_replace에 일치하는 배열을 전달할 수 있습니다 마음에 베어 또한

$data = htmlentities($data, ENT_QUOTES, 'UTF-8', false); 
$data = html_entity_decode($data, ENT_QUOTES, 'UTF-8'); 

, http://php.net/manual/en/function.str-word-count.php

나는 당신의 목표에 가까운 무언가를했습니다 최근 :

$words = array_unique(str_word_count($CONTENT." ".$TITLE, 1)); 
    sort($words); 
    $words = addslashes (implode(" ", array_values($words))); 

안녕하세요.

+0

불행히도 str_word_count는 åäö에서 작동하지 않습니다. å, ä 또는 ö에 닿으면 모든 단어를 두 단어로 잘라냅니다. – jamietelin

1
print_r(explode(" ", $data)); 

업데이트

define("WORD_COUNT_MASK", "/\p{L}[\p{L}\p{Mn}\p{Pd}'\x{2019}]*/u"); 

function str_word_count_utf8($str) 
{ 
    preg_match_all(WORD_COUNT_MASK, $str, $matches); 
    print_r($matches); 
} 
str_word_count_utf8($str); 
+0

당신의 노력에 감사드립니다! 그러나 이것은 아무 것도하지 않았습니다. 그것은 내가 이미하는 일입니다. – jamietelin

관련 문제