在字符串开头或在字符串开头的白名单单词之后隔离单词

Isolate word at start of string or after a whitelisted word at the start of the string

我想要 preg_match() 一组特定的规则,我正在尝试进行预匹配,它们是:

  1. 字符串的所有单词(仅字母和数字)被 _
  2. 分割
  3. 第一个词可以是Brand(不区分大小写),也可以是我要抓取的目标词。
  4. 目标词后面可能还有更多的词或数字,我不需要这个信息。
  5. 目标词总是至少有 1 个字母,可能有也可能没有数字

例子

我不知道如何开始

$list = ['Brand_GoPro360', 'brand_My247test', 'bRanD_Apple_worth_84953', 'Brand_Xbox1_isawesome745', 'Microsoft', 'KFC_2345_growth', 'Playstation_iscool3424'];

$pattern = "/(?i)(brand)/";
    foreach ($list as $words) {

        echo (preg_match($pattern, $words));
   
    }
}

使用正则表达式

/^(?:brand_)?([a-z0-9]+)/i

(?:brand_)? 使得 brand_ 在开头是可选的。 ([a-z0-9]+) 匹配下一个单词,并将其放入捕获组 1。

$pattern = '/^(?:brand_)?([a-z0-9]+)/i';
foreach ($list as $words) {
    if (preg_match($pattern, $words, $match)) {
        echo $match[1];
    }
}

可选择匹配前导 brand_ 子字符串(不区分大小写),然后捕获下一个出现的“word”子字符串,然后匹配字符串中的任何剩余字符。用捕获的子字符串替换完整的字符串,你就完成了。

我正在使用 [^_]+ 来匹配一个或多个非下划线字符,但您可以使用 [a-z\d]+ 来明确捕获字母数字字符。

代码:(Demo)

var_export(preg_replace('~^(?:brand_)?([^_]+).*~i', '', $list));

输出:

array (
  0 => 'GoPro360',
  1 => 'My247test',
  2 => 'Apple',
  3 => 'Xbox1',
  4 => 'Microsoft',
  5 => 'KFC',
  6 => 'Playstation',
)