Заменить строку в PHP - не работает с более длинной строкой - PullRequest
0 голосов
/ 15 января 2020

Я новичок в php.

У меня есть этот код:

function allergen(string $value): string
    {
        $allergens = ['pszenica', 'pszenicy', 'żyto', 'żyta', 'jęczmień', 'jęczmieniem', 'jęczmienia', 'owies', 'owsem', 'owsa', 'orkisz', 'orkiszem', 'orkisza', 'jaja', 'jajka', 'jajo', 'jajecznica', 'jajeczny', 'jajeczna', 'z jajkiem', 'jajko', 'ryby', 'ryb', 'rybne', 'rybny', 'dorsz', 'dorsza', 'dorszem', 'łosoś', 'łososiem', 'łososia', 'mintaj', 'mintajem', 'mintaja', 'makrela', 'makrelą', 'makreli', 'miruna', 'miruną', 'miruny', 'pstrąg', 'pstrągiem', 'pstrąga', 'sola', 'śledź', 'śledziem', 'śledzi', 'sardynki', 'sardynka', 'sardynek', 'sardynkami', 'halibut', 'halibuta', 'halibutem', 'szczupak', 'szczupakiem', 'szczupaka', 'sandacz', 'sandaczem', 'sandacza', 'tuńczyk', 'tuńczyka', 'tuńczykiem', 'kergulena', 'kergulą', 'orzeszki', 'orzechy', 'orzech', 'orzechowy', 'orzechowe', 'orzechami', 'migdały', 'migdałami', 'migdał', 'nerkowce', 'pistacje', 'pistacjami', 'pistacji', 'migdałowe', 'płatki migdałowe', 'płatkami migdałowymi', 'seler', 'z selerem', 'selerowy', 'gorczyca', 'gorczycą', 'gorczycy', 'sezam', 'sezamowe', 'sezamu', 'sezamem', 'musztarda', 'musztardą'];
        if (in_array(mb_strtolower($value), $allergens)) {
            return "<b>$value</b>";
        } else {
            return $value;
        }
    }

Работает нормально, когда я использую эту функцию:

allergen('owies');

(add <b>owies</b>)

Но проблема, когда у меня есть:

allergen('lubie takie owies')

Мне нужен результат:

lubie takie <b>owies</b>

Как восстановить эту функцию?

Ответы [ 2 ]

2 голосов
/ 15 января 2020

Простой пример работы вашего примера - создать массив всех слов, введенных вами, и проверить каждое из них по отдельности. Вот пример:

function allergen(string $value): string
    {
        $return = "";
        $allergens = ['pszenica', 'pszenicy', 'żyto', 'żyta', 'jęczmień', 'jęczmieniem', 'jęczmienia', 'owies', 'owsem', 'owsa', 'orkisz', 'orkiszem', 'orkisza', 'jaja', 'jajka', 'jajo', 'jajecznica', 'jajeczny', 'jajeczna', 'z jajkiem', 'jajko', 'ryby', 'ryb', 'rybne', 'rybny', 'dorsz', 'dorsza', 'dorszem', 'łosoś', 'łososiem', 'łososia', 'mintaj', 'mintajem', 'mintaja', 'makrela', 'makrelą', 'makreli', 'miruna', 'miruną', 'miruny', 'pstrąg', 'pstrągiem', 'pstrąga', 'sola', 'śledź', 'śledziem', 'śledzi', 'sardynki', 'sardynka', 'sardynek', 'sardynkami', 'halibut', 'halibuta', 'halibutem', 'szczupak', 'szczupakiem', 'szczupaka', 'sandacz', 'sandaczem', 'sandacza', 'tuńczyk', 'tuńczyka', 'tuńczykiem', 'kergulena', 'kergulą', 'orzeszki', 'orzechy', 'orzech', 'orzechowy', 'orzechowe', 'orzechami', 'migdały', 'migdałami', 'migdał', 'nerkowce', 'pistacje', 'pistacjami', 'pistacji', 'migdałowe', 'płatki migdałowe', 'płatkami migdałowymi', 'seler', 'z selerem', 'selerowy', 'gorczyca', 'gorczycą', 'gorczycy', 'sezam', 'sezamowe', 'sezamu', 'sezamem', 'musztarda', 'musztardą'];
        $words = explode(' ', $value); // create an array of words
        foreach($words as $word) { //iterate through words
            if (in_array(mb_strtolower($word), $allergens)) {
                $return .= "<b>" . $word . "</b> ";
            } else {
                $return .= $word . " ";
            }
        }
        return trim($return); //remove trailing space from the end
    }

    echo allergen('lubie takie owies'); // returns: lubie takie <b>owies</b>
1 голос
/ 15 января 2020

Это можно сделать с помощью preg_replace() вместо in_array(). Однако обратите внимание, что вам нужно будет добавлять разделители к каждой строке в вашем массиве $allergens.

$string = 'lubie takie owies';
$allergens = ['/pszenica/', '/pszenicy/', '/żyto/', '/żyta/', '/jęczmień/', '/jęczmieniem/', '/jęczmienia/', '/owies/', '/owsem/', '/owsa/'];

$result = preg_replace($allergens, '<b>$0</b>', $string);

var_dump($result);

DEMO

...