Извлекать слова из предложения в массив на основе строки - PullRequest
0 голосов
/ 06 февраля 2020

Я ищу наиболее эффективное решение, которое позволит мне создать шаблон строки для извлечения слов и фраз из предложения, использующего структуру шаблона.

Допустим, у меня есть string как следует:

$template = '%% is %% because %%.';

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

$strings = [
    'Cheese is the best thing because it is great on chips.',
    'My brother is my best friend because he\'s always been there.', 
    'Listen! StackOverflow is how I am still employed because I am not afraid to ask for help.',
    'Derp... Why is it that I can\'t do this easily? Maybe it is because I need more practice.'
];

Мне нужен logi c, который может извлечь текст в том месте, где %% подстановочные знаки находятся в $template, так что массив $strings может использоваться для получения следующего:

$template = '%% is %% because %%.';
$result = [
    ['Cheese','the best thing','it is great on chips.'],
    ['My brother','my best friend','he\'s always been there.'], 
    ['Listen! StackOverflow','how I am still employed','I am not afraid to ask for help.'],
    ['Derp... Why', 'it that I can\'t do this easily? Maybe it is','I need more practice.']
];

Примечание : Использование 'взрыва' с физическими словами / буквами это не лучший вариант, потому что некоторые слова могут иметь несколько вхождений, и мы хотим указывать только первое вхождение в таком событии.

1 Ответ

1 голос
/ 06 февраля 2020

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

$template = '(.+?) is (.+?) because (.+?)';

foreach($strings as $string) {
    preg_match("/$template/", $string, $matches);
    $result[] = [$matches[1], $matches[2], $matches[3]];
    //or
    //$result[] = array_slice($matches, 1);
}

Вы хотите добавить проверку ошибок, если совпадений нет, или только 1 или 2 et c.

Если по какой-то причине вам нужна указанная c шаблонная номенклатура, тогда:

$template = '%% is %% because %%.';
$template = str_replace('%%', '(.+?)', $template);
...