在我的模式后停止匹配正则表达式中的字符串

时间:2017-03-18 12:56:02

标签: php regex

我正在尝试匹配字符串模式,而我的正则表达式是

/^[a-zA-Z0-9]*(-|\s)*Iphone 7(\s|-)?(\p{N}GB)?\B/i

我想要匹配的字符串是Apple Iphone 7 Plus 16 Gb。我想匹配完全正则表达式,即Iphone 7应该只与下面的

匹配
  • [任何数字或字符串] apple iphone 7
  • [任何数字或字符串] apple iphone 7 16 gb
  • [任何数字或字符串] apple iphone 7 32GB - Silver
  • [任何数字或字符串] apple iphone 7 plus(不应该匹配)
  • [任何数字或字符串] apple iphone 7s(不应该匹配)

请让我知道我做错了什么? 这是正则表达式link

3 个答案:

答案 0 :(得分:1)

不确定是否理解您的需求,但如何:

/^.*?iphone 7(?:\s+(?:plus\s+)?\d+\s?gb.*)?$/i

<强>解释

/               : regex delimiter
  ^             : begining of string
    .*?         : 0 or more any characters not greedy
    iphone 7    : literally
    (?:         : start non capture group
      \s+       : 1 or more spaces
      (?:       : start non capture group
        plus    : literally
        \s+     : 1 or more spaces
      )?        : end group^, optional
      \d+       : 1 or more digits
      \s?       : 1 optional space
      gb        : literally
      .*        : 0 or more any character
    )?          : end group, optional
  $             : end of string
/i              : regex delimiter, case insensitive

在行动中:

$tests = array(
'any digits or string apple iphone 7',
'any digits or string apple iphone 7 16 gb',
'any digits or string apple iphone 7 32GB - Silver',
'any digits or string apple iphone 7 plus',
'any digits or string apple iphone 7s',
);
foreach ($tests as $test) {
    echo "$test\t ==> ";
    if (preg_match('/^.*?iphone 7(?:\s+(?:plus\s+)?\d+\s?gb.*)?$/i', $test)) {
        echo "match\n";
    } else {
        echo "doesn't match\n";
    }
}

<强>输出:

any digits or string apple iphone 7  ==> match
any digits or string apple iphone 7 16 gb    ==> match
any digits or string apple iphone 7 32GB - Silver    ==> match
any digits or string apple iphone 7 plus     ==> doesn't match
any digits or string apple iphone 7s     ==> doesn't match

答案 1 :(得分:0)

如果您真的只对字符串的Apple Iphone 7位感兴趣,并且您正在使用PHP,那么为什么不这么做呢:

if (stripos($string,'Apple Iphone 7 Plus') !== FALSE) echo 'Wow a 7 Plus!';
else if (stripos($string,'Apple Iphone 7') !== FALSE) echo 'It is only a 7';

换句话说:尽可能避免使用复杂的正则表达式,只在需要时才使用它们。

答案 2 :(得分:0)

使用此正则表达式,您可以匹配,如果您想要可以提取一些有关它的信息

(?!apple iphone .* plus)(?:apple iphone 7)(?>\s(?<storage>\d+)?\s?(?:gb))?

您可以看到demo

我已经更新了一下,现在将与以下内容相匹配

  • [任何数字或字符串] apple iphone 7
  • [任何数字或字符串] apple iphone 7 16 gb
  • [任何数字或字符串] apple iphone 7 32GB
  • [任何数字或字符串] apple iphone 7 [任何数字或字符串]
  • [任何数字或字符串] apple iphone 7 16 gb [任何数字或字符串]
  • [任何数字或字符串] apple iphone 7 32GB [任何数字或字符串]

与以下

不符
  • [任何数字或字符串] apple iphone 7 plus
  • [任何数字或字符串] apple iphone 7 plus [any digits or string]
  • [任何数字或字符串] apple iphone 7 16 gb plus
  • [任何数字或字符串] apple iphone 7 16 gb加[任何数字或字符串]
  • [任何数字或字符串] apple iphone 7 32GB plus [任意数字或字符串]