Проблема при попытке извлечь слова из строки в PHP - PullRequest
3 голосов
/ 15 декабря 2010

Я пытаюсь извлечь все слова из строки в массив, но у меня возникают некоторые проблемы с пробелами ( ).

Вот что я делаю:

<code>//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("&nbsp;", ' ', $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 "
";

Это выводит:

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; и другие лишние странные пробелы), мне это нравится, и это намного лучше, чем мой оригинальный код.

Спасибо всем, кто внес свой вклад в это!

<code>//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 "
";

Ответы [ 6 ]

2 голосов
/ 15 декабря 2010

Возможно ли, что вы "дважды кодируете" какие-либо существующие &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);
2 голосов
/ 15 декабря 2010

Хорошо, единственное, что вам нужно сделать, это заменить &nbsp; пробелом, как вы уже делаете (только если строка действительно все еще содержит &nbsp; проверить @ ответ Энди Е , чтобы сделать убедитесь, что ваши данные не содержат никаких HTML-сущностей.):

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

Тогда вы можете использовать str_word_count, чтобы получить слова:

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

P.S .: Какой смысл сначала звонить htmlentities, а потом снова возвращать его с html_entity_decode? 1016 *

Обновление: Пример:

$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] => ÅÅ
)

Чтение документации помогает:)

1 голос
/ 15 декабря 2010
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);
1 голос
/ 15 декабря 2010

Вместо:

14x str_replace

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

do:

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

Принимая во внимание, что 0xC2A0 - это неразрывный пробел (&nbsp;), а \s - любой пробелсимвол, охватывающий повторяющиеся вызовы str_replace.

0 голосов
/ 15 декабря 2010

может быть, вам стоит попробовать это: 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)));

Bye.

0 голосов
/ 15 декабря 2010
$data = '&nbsp; cesadasdsadas <br /> &nbsp; dsadsadas';
$data = preg_replace('/&nbsp;/', ' ', $data);
var_dump($data);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...