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;像您已经做的那样用空格替换(仅当字符串确实仍然包含&nbsp;检查@Andy E's answer以确保您的数据不包含任何HTML实体。):

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

然后你可以用str_word_count得到的话:

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

PS:先调用htmlentities再revert in withhtml_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;. 您可以通过提供第四个参数来防止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

代替:

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 回答
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 回答
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 回答