preg_match_all将“(-)”与“高加索/非西班牙裔”匹配

时间:2018-09-11 23:26:33

标签: php

如果要包含所有字符中的“(-)”,我想要一个字符串。

以下代码检查字符串是否包含“(18-35)”之类的范围,如果是,则它将18放入$ min,将35放入$ max。

但是我的if语句是否也与“高加索/非西班牙裔”匹配。您如何解决此问题?

if (preg_match('(-)', $data[$demographicRequirement[$i]])){
                        if($demographicRequirement[$i] == "age_group" || $demographicRequirement[$i] == "Age" ||
                            $demographicRequirement[$i] == "Age_group" ||  $demographicRequirement[$i] == "age"){
                                preg_match_all('/\((.*)-/', $data[$demographicRequirement[$i]], $matches);
                                $min = intval($matches[1][0]);
                                preg_match_all('/\-(.*)\)/', $data[$demographicRequirement[$i]], $matches);
                                $max = intval($matches[1][0]);
                                $date = new DateTime('now');
                                date_sub($date,date_interval_create_from_date_string($min . " years"));
                                $minAge = date_format($date,"Y-m-d");
                                $date = new DateTime('now');
                                date_sub($date,date_interval_create_from_date_string($max . " years"));
                                $maxAge = date_format($date,"Y-m-d");
                                $whereCondition[] = "(" . "date_of_birth" . " BETWEEN '" . $maxAge . "' AND '" . $minAge . "')";
                        }else{
                            preg_match_all('/\((.*)-/', $data[$demographicRequirement[$i]], $matches);
                            $min = intval($matches[1][0]);
                            preg_match_all('/\-(.*)\)/', $data[$demographicRequirement[$i]], $matches);
                            $max = intval($matches[1][0]);
                            $whereCondition[] = "(" . $demographicRequirement[$i] . " BETWEEN " . $min . " AND " . $max . ")";
                        }
                    }else{
                        $whereCondition[] = $demographicRequirement[$i] . " ='" . $data[$demographicRequirement[$i]]. "'";
                    }

1 个答案:

答案 0 :(得分:1)

因此,假设该字符串可以像您的示例一样包含空格,我想这就是您要查找的内容:

\((\d{1,2})\s*-\s*(\d{2})\)

现在细分:

  • \(和\)匹配文字括号
  • \ d寻找一个数字(与[0-9]相同)
  • {x,y}表示“之间的长度”,而{x}表示“正好这么多”
  • \ s *是可选的空格,取决于是否为必需

每个部分作为捕获组括在括号中,因此您可以在$ matches数组中找到它们,[1]是您的$ min值,[2]是您的$ max值,这简化了解析。 / p>

将它们放在一起:

if(preg_match('/\((\d{1,2})\s*-\s*(\d{2})\)/', $data[$demographicRequirement[$i]], $matches) === 1) {
    $min = $matches[1];
    $max = $matches[2];
}

这匹配“(18-25)”,“(18-25)”和“(8-18)”,但没有文本。

希望有帮助