Удалите подстроку, начинающуюся с конкретного слова и заканчивающуюся "."
Из середины текста мне нужно вырезать предложение или, что лучше, информацию об ингредиентах продукта. Логика позади всегда одинакова. Начиная с "Ингредиенты" и заканчивая точкой "."
Например (это мой $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:
и сопровождается любым набором символов, кроме точки [^\.]
по крайней мере, с появлением (+
) и заканчивая точкой \.
Пожалуйста, обратите внимание: если ингредиенты имеют точку где-то и продолжаются, это, в основном, удалит только определенную их часть.