去除以特定单词开头并以“。”结尾的子字符串。

时间:2019-08-21 07:53:26

标签: php string substring strpos display-cutouts

从文本的中间,我需要删去一个句子或更好地了解有关产品成分的信息。 背后的逻辑始终是相同的。 以“成分”开头,以点“。”结尾。

例如(这是我的$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 个答案:

答案 0 :(得分:2)

尝试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液盎司),天然黄酮rs

答案 1 :(得分:1)

您快到了。 $prodIngredientsData 将字符串存储在“成分” 之后。因此,我们需要提取“成分” 和第一个”之间的字符串。

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;
}

答案 2 :(得分:0)

您需要正则表达式。就像是  preg_match('/Ingredients.*?\./', $string, $match);

答案 3 :(得分:0)

您可以再次使用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;

答案 4 :(得分:0)

您可以将preg_replace用于此类任务。

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

正则表达式Ingredients:[^\.]+\.表示一个字符串(基本上放在$prodIngredientsData的任何地方)(从字面上)匹配Ingredients:,后跟任意一组字符,但点[^\.]带有至少出现一次(+),并以点\.

结尾

请注意:如果配料在某处有一点并继续,则基本上只会去除其中的一部分。

答案 5 :(得分:0)

您可以搜索str_pos的开头和结尾,并保存它们之间的字符串,然后进行下一个搜索直到结尾。检查demo

$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)."
}