3

文字列からすべての単語を配列に抽出しようとしていますが、スペース (  ) に問題があります。

これが私がすることです:

//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;.
どんなに頑張っても、これを文字列から削除することはできません。何か案は?

更新:
コードを微調整した後、次の出力を取得することができました:

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>";
4

6 に答える 6

2

わかりました、あなたがしなければならない唯一のことは、すでに行っているようにスペースに置き換えること&nbsp;です(文字列に実際にまだ含まれている場合のみ、@Andy Eの回答&nbsp;をチェックして、データにHTMLエンティティが含まれていないことを確認してください.):

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

次にstr_word_count、単語を取得するために使用できます。

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

PS: 最初に呼び出してから、とにかく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] => ÅÅ
)

ドキュメントを読むと役立ちます:)

于 2010-12-15T13:24:07.320 に答える
2

&nbsp;文字列の既存の部分を「二重にエンコード」している可能性はありますか? htmlentitiesの前に文字列を呼び出すhtml_entity_decodeので、既存の&nbsp;文字はすべて になり&amp;nbsp;ます。4 番目のパラメーターとして指定htmlentitiesすることで、二重エンコードを防ぐことができます。false

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

また、 で一致する配列を渡すことができることに注意してくださいstr_replace

$data = str_replace(array(',','.',':',';','*','?','!','-'), '', $data);
于 2010-12-15T13:26:40.897 に答える
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);
于 2010-12-15T13:56:24.630 に答える
1

それ以外の:

14x str_replace

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

行う:

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

一方0xC2A0、 は非改行スペース ( &nbsp;) であり、繰り返される呼び出し\sをカバーする任意の空白文字です。str_replace

于 2010-12-15T13:25:46.797 に答える
0
$data = '&nbsp; cesadasdsadas <br /> &nbsp; dsadsadas';
$data = preg_replace('/&nbsp;/', ' ', $data);
var_dump($data);
于 2010-12-15T13:23:49.817 に答える
0

多分あなたはこれを試してみるべきです: 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)));

さよなら。

于 2010-12-15T13:28:25.763 に答える