сопоставить любые термины в тексте с готовым списком терминов - PullRequest
0 голосов
/ 28 октября 2018

У меня есть массив терминов:

$arr = [
  'black',
  'white and black',
  'lion',
  'fast',
  'zebra',
  'lion is fast',
  'zebra is white'
];

Я хочу отфильтровать этот массив по определенному предложению, например:

zebra is white and black, and lion is fast

Iпопытался использовать strpos и некоторые функции регулярных выражений, но я не получил ожидаемый результат.Я ожидаю получить minimum количество элементов в списке, которое соответствует частям предложения IN ORDER, которое будет:

[
  'white and black',
  'zebra',
  'lion is fast'
]

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

\zebra\ is \white and black\, and \lion is fast\

и игнорируйте другие элементы в массиве, так как они не полностью совпадают.

Не могли бы вы привести меня к правильному путисделать это?

1 Ответ

0 голосов
/ 28 октября 2018

Сортировка массива по длине и зацикливание.
Когда вы найдете элемент массива в строке, сохраните его в новом массиве и удалите подстроку из строки.

В конце кода вы получите массив соответствующих элементов.

$arr = ['black',
'white and black',
'lion',
'fast',
'zebra',
'lion is fast',
'zebra is white'];

$str = "zebra is white and black, and lion is fast";

function sortl($a,$b){
    return strlen($b)-strlen($a);
}

usort($arr,'sortl');

foreach($arr as $s){
    if(strpos($str, $s) !== false){
        $new[] = $s;
        $str = str_replace($s, "", $str);
    }
}

var_dump($new);

Вывод:

array(3) {
  [0]=>
  string(15) "white and black"
  [1]=>
  string(12) "lion is fast"
  [2]=>
  string(5) "zebra"
}

https://3v4l.org/7iTHC

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...