Удалите подстроку, начинающуюся с конкретного слова и заканчивающуюся "."

Из середины текста мне нужно вырезать предложение или, что лучше, информацию об ингредиентах продукта. Логика позади всегда одинакова. Начиная с "Ингредиенты" и заканчивая точкой "."

Например (это мой $prodDesc):

Coca Cola is the most famous soft drink in America.
Ingredients: Carbon water, Sugar (sucrose or high-fructose corn syrup (HFCS) depending on country of origin), Caramel colour (E150d), Phosphoric Acid, Caffeine (34 mg/12 fl oz), natural Flavours. Nutrition Facts: 1 Serving Per Container - Serving Size: 1 Can. Total Fat 0g Sodium 45mg Total Carbohydrate 39g Total Sugars (Includes 39g Added Sugars) Cholesterol 0mg Protein 0g Vitamin D 0g Calcium 0g Iron 0g Potassium 0g

Я пытался до сих пор с strpros но факт, что это в середине текста, я получаю все от "Ингредиентов" до конца.

Мне нужно только это в качестве вывода:

$prodIngredientsData = "Ingredients: Carbon water, Sugar (sucrose or high-fructose corn syrup (HFCS) depending on country of origin), Caramel colour (E150d), Phosphoric Acid, Caffeine (34 mg/12 fl oz), natural Flavours."

Учитывая, что $ prodDesc - это описание выше, моя попытка была:

$searchstring = $prodDesc;
$prodIngredientsData = false;
if (strpos($searchstring, "Ingredients") !== false)
{
    $sd_array = explode("Ingredients", $searchstring);
    $sd = end($sd_array);
    $prodIngredientsData = "Ingredients " . $sd;
}
else {
    $prodIngredientsData = false;
}

Но, как уже упоминалось, я получаю все от "Ингредиентов" до конца описания. Но он должен остановиться на первой полной остановке в примере "Ингредиенты...... натуральные ароматизаторы".

6 ответов

Решение

Попробуйте с preg_match:

$prodIngredientsData = "Ingredients: Carbon water, Sugar (sucrose or high-fructose corn syrup (HFCS) depending on country of origin), Caramel colour (E150d), Phosphoric Acid, Caffeine (34 mg/12 fl oz), natural Flavours."
preg_match('/(Ingredients:([^.]+))/', $prodIngredientsData, $matches);

echo $matches[0];

Выход:

Состав: Углеводородная вода, Сахар (сахарозный или кукурузный сироп с высоким содержанием фруктозы (HFCS) в зависимости от страны происхождения), Карамельный цвет (E150d), Фосфорная кислота, Кофеин (34 мг /12 жидких унций), натуральные ароматизаторы

Ты почти там. $prodIngredientsData сохраняет строку после "Ингредиенты". Итак, нам нужно извлечь строку между "Ingredients " и первым "."

if (strpos($searchstring, "Ingredients") !== false)
{
    $sd_array = explode("Ingredients", $searchstring);
    $sd = end($sd_array);
    $prodIngredientsData = "Ingredients " . $sd;
    $end_pos   = strpos($prodIngredientsData, ".");
    $prodIngredientsData = substr($prodIngredientsData , 0, $end_pos+1);

} else {
    $prodIngredientsData = false;
}

Вы можете использовать strpos снова, чтобы найти точку остановки и сократить строку.

$searchstring = $prodDesc;
$prodIngredientsData = false;
$ingredientsPos = strpos($searchstring, "Ingredients");
if ($ingredientsPos !== false) {
    $prodIngredientsData = substr($searchstring, $ingredientsPos);
    $stopPos = strpos($prodIngredientsData, ".");
    if ($stopPos !== false) {
        $prodIngredientsData = substr(
                    $prodIngredientsData,
                    0,
                    $stopPos + 1);
    }
}
echo $prodIngredientsData;

Вы можете искать начало и конец с str_pos и сохраните строку между ними, затем выполните следующий поиск до конца. Проверьте демо

$begin_offset = 0;
$result = [];
$string = ""
while(false !== ($begin_offset=strpos($string,"Ingredients",$begin_offset)) && false !== ($end_offset=strpos($string,".",$begin_offset))){
    $result[] = substr($string,$begin_offset,$end_offset-$begin_offset);
    $begin_offset = $end_offset;
}
var_dump($result);

Демо-результат,

array(2) {
  [0]=>
  string(195) "Ingredients: Carbon water, Sugar (sucrose or high-fructose corn syrup (HFCS) depending on country of origin), Caramel colour (E150d), Phosphoric Acid, Caffeine (34 mg/12 fl oz), natural Flavours."
  [1]=>
  string(77) "Ingredients: Carbon water, Sugar (sucrose or high-fructose corn syrup (HFCS)."
}

Вам нужно регулярное выражение. Что-то вроде preg_match('/Ingredients.*?\./', $string, $match);

Вы можете использовать preg_replace для такого рода задач.

$strippedString = preg_replace('/Ingredients:[^\.]+\./', '', $prodIngredientsData);

Регулярное выражение Ingredients:[^\.]+\. указывает на строку (размещается в основном везде в $prodIngredientsData) соответствие (буквально) Ingredients: и сопровождается любым набором символов, кроме точки [^\.] по крайней мере, с появлением (+) и заканчивая точкой \.

Пожалуйста, обратите внимание: если ингредиенты имеют точку где-то и продолжаются, это, в основном, удалит только определенную их часть.

Другие вопросы по тегам