Php 如何删除以';否';和它们各自的逗号从逗号分隔的列表中,剩下的?

Php 如何删除以';否';和它们各自的逗号从逗号分隔的列表中,剩下的?,php,Php,我如何从$elements中删除任何带有“no”及其各自逗号的内容,而留下其余内容 $elements = "cheese, no tomato, no onion, mayo, no lettuce"; 正则表达式可能不是防弹的,但这应该可以: $pattern = '/,?\s*no \w+/'; $elements = "cheese, no tomato, no onion, mayo, no lettuce"; $str = preg_replace($pattern, '', $

我如何从$elements中删除任何带有“no”及其各自逗号的内容,而留下其余内容

$elements = "cheese, no tomato, no onion, mayo, no lettuce";

正则表达式可能不是防弹的,但这应该可以:

$pattern = '/,?\s*no \w+/';
$elements = "cheese, no tomato, no onion, mayo, no lettuce";

$str = preg_replace($pattern, '', $elements);
echo $str;


// echos "cheese, mayo"

例如,我说的不是“防弹的”,我的意思是,如果逗号之间的值中有逗号,则会导致问题等。

解决此问题的一种方法是将成分列表拆分为一个逗号,然后过滤掉以
no
开头的值,然后再次对列表进行内爆。这样做的优点是不会在输出中留下挂起的逗号:

function filter_ingredients($elements) {
    return implode(', ', array_filter(preg_split('/,\s*/', $elements), function ($v) {
        return !preg_match('/^no\b/', $v);
    }));
}
例如:

echo filter_ingredients("cheese, no tomato, no onion, mayo, no lettuce") . "\n";
echo filter_ingredients("no cheese, tomato, no onion, no mayo, lettuce") . "\n";
echo filter_ingredients("no cheese, no tomato, onion, no mayo, no lettuce") . "\n";
输出:

cheese, mayo
tomato, lettuce
onion


请注意,此代码假定您的配料中没有逗号。

尝试使用
不含奶酪、番茄的配料。
。它留下了一个挂起的逗号。@Nick是的,定义不完美。我想你以后可以单独清理。或者是比我更精通正则表达式的人that@Nick或者用你的答案,那更优雅一点;)您只需添加一个
修剪
。尝试使用正则表达式执行此操作很棘手,因为您需要提前查看下一个值以决定是否删除尾部逗号。这看起来像我需要的,但我只有变量$elements。我试过:回声过滤器(元素)。“\n”;但它不起作用right@EPH这是正确的称呼。它在输出中留下了一些“不”的短语:$元素是“汉堡、白面包、没有辣椒、没有洋葱、没有蘑菇、没有奶酪、没有培根、没有生菜、没有番茄、泡菜、蛋黄酱、没有番茄酱、没有副菜、没有饮料”,它输出汉堡包,白面包,没有洋葱,没有生菜,没有番茄,泡菜,蛋黄酱,没有番茄酱“$elements变量已发布到页面,因此我无法访问实际字符串,我只是给出了变量中字符串的示例。对不起,请原谅我的困惑!我看它应该能工作,我无法解释为什么它不能为我工作。@EPH不用担心-但是如果你不能给我一个字符串,导致问题,我就无法解决问题。