Home » Php » php – String replace function not always working

php – String replace function not always working

Posted by: admin February 25, 2020 Leave a comment

Questions:

I am beginner in PHP and Laravel.

I have this code:

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ą', 'gluten', 'glutenem', 'glutenu', 'pszenica', 'pszenicy', 'pszenicą', 'pszenicę', 'pszenny', 'pszenna', 'pszenny', 'pszenne', 'pszeniczne', 'pszenną', 'pszennej', 'żyto', 'żyta', 'żytni', 'żytnie', 'żytnia', 'żytniej', 'żytnim', 'pszenno-żytni', 'pszenno-żytnia', 'pszenno-żytnie', 'pszenno-żytnią', 'pszenno-żytniej', 'pszenno-żytni', 'jęczmień', 'jęczmieniem', 'jęczmienia', 'jęczmienny', 'jęczmienna', 'jęczmienne', 'jęczmienną', 'jęczmiennym', 'jęczmienniej', 'owies', 'owsem', 'owsa', 'owsiane', 'owsiany', 'owsiana', 'owsianą', 'owsianym', 'owsianej', 'orkisz', 'orkiszem', 'orkisza', 'orkiszowe', 'orkiszowy', 'orkiszowe', 'orkiszowym', 'orkiszową', 'orkiszowej', 'jaja', 'jajka', 'jajo', 'jajecznica', 'jajeczny', 'jajeczna', ' jajkiem', 'jajko', 'jajem', 'jajecznym', 'jajeczne', 'jajami', 'jajkami', 'jajecznej', 'ryby', 'ryb', 'rybne', 'rybny', 'rybnej', 'rybnymi', 'rybną', 'rybnym', 'dorsz', 'dorsza', 'dorszem', 'dorszowe', 'łosoś', 'łososiem', 'łososia', 'łososiowe', 'łososiowy', 'mintaj', 'mintajem', 'mintaja', 'makrela', 'makrelą', 'makreli', 'miruna', 'miruną', 'miruny', 'pstrąg', 'pstrągiem', 'pstrąga', 'sola',  'śledź', 'śledziem', 'śledzi', 'śledziami', 'śledziowa', 'śledziowe',  'sardynki', 'sardynka', 'sardynek', 'sardynkami', 'halibut', 'halibuta', 'halibutem', 'szczupak', 'szczupakiem', 'szczupaka', 'sandacz', 'sandaczem', 'sandacza', 'tuńczyk', 'tuńczyka', 'tuńczykiem', 'tuńczykowe', 'kargulena', 'karguleną', 'karguleny',  'okoń', 'okonia', 'okoniem', 'karp', 'karpiem', 'karpia', 'leszcz', 'leszcza', 'leszczem', 'karaś', 'karasia', 'krewetki', 'krewetkami', 'krewetkowy', 'krewetkowa', 'krewetkowe', 'krewetek' , 'krewetkowymi',  'kalmary', 'kalmarami', 'kalmarów', 'kalmarowe', 'kalmarowa', 'kalmary', 'ślimaki', 'ślimakami', 'ślimaków', 'orzeszki', 'orzechy', 'orzech', 'orzechowy', 'orzechowe', 'orzechowa', 'orzechami', 'orzechową', 'orzechowych', 'orzechowym', 'orzechem', 'migdały', 'migdałami', 'migdał', 'migdałowe', 'migdałowy', 'migdałowa', 'migdałowym', 'migdałową', 'nerkowce', 'nerkowca', 'pistacje', 'pistacjami', 'pistacji', 'pistacjowe', 'pistacjowym', 'pistacjową',  'płatki migdałowe', 'płatkami migdałowymi', 'płatków migdałowych', 'pekan', 'makadamia', 'seler', 'selerem', 'selerowy', 'selera', 'selerowa', 'selerowej', 'selerową', 'selerowych', 'gorczyca', 'gorczycą', 'gorczycy', 'gorczycę', 'gorczycowy', 'sezam', 'sezamowe', 'sezamu', 'sezamem', 'sezamki', 'sezamowy', 'sezamowa', 'sezamek', 'sezamową', 'sezamych', 'soja', 'sojowe', 'sojowa', 'sojowy', 'soją', 'soi', 'sojowego', 'sojowej', 'sojowych', 'sojową', 'mleko', 'mleczy', 'mleczna', 'mleczne', 'mleka', 'mlekiem', 'mlecznego', 'mlecznej', 'mleczną', 'łubin', 'łubinowy', 'łubinem', 'łubinu'];
    $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('Grillowana pierś z kurczaka, kasza jęczmienna, surówka z czerwonej kapusty z rodzynkami. pszenica 2');

In result in this code I have:

Grillowana pierś z kurczaka, kasza jęczmienna, surówka z czerwonej kapusty z rodzynkami. <b>pszenica</b> 2

The correct result is:

Grillowana pierś z kurczaka, kasza <b>jęczmienna</b>, surówka z czerwonej kapusty z rodzynkami. <b>pszenica</b> 2

Problem is with “jęczmienna”. This string is not add from function.

How can I repair it?

How to&Answers:

When you are exploding your input string the word you are looking for contains comma , at the end: jęczmienna,. This, of course, will not work as expected because you are comparing jęczmienna to jęczmienna,.

What you could do is to trim words you have by removing all non-alphabetic characters

$word = preg_replace('/[^\w]/uis', '', $word);

Answer:

Simply add something to remove the commas from the input string before you explode it on spaces, so you are not comparing jęczmienna with jęczmienna,.

$value = str_replace(',', '', $value);
$words = explode(' ', $value); // create an array of words