preg_match_all - 匹配两个选项

时间:2018-02-08 13:19:13

标签: php regex preg-match preg-match-all

preg_match让我感到困惑,所以如果这是一个简单的问题或之前被问过我道歉,但我无法理解答案,知道它是否符合我的要求。

我有一个遵循这种格式的字符串: 测试1#1.00测试2#2.00测试3#3.00

然后我使用这个模式来分离值 /(?P<first>([^**]*?))#(?P<second>\d{0,7}(?:\.\d{1,2}))/

最后以

结束

数组([0] =&gt;测试1 [1] =&gt;测试2 [2] =&gt;测试3)

数组([0] =&gt; 1.00 [1] =&gt; 2.00 [2] =&gt; 3.00)

我正在努力改变模式以找到像目前那样的小数或字母/字母FOC或TBC

所以我的字符串将是例如:测试1#1.00测试2#FOC测试3#3.00

我的数组将是:

数组([0] =&gt;测试1 [1] =&gt;测试2 [2] =&gt;测试3)

数组([0] =&gt; 1.00 [1] =&gt; FOC [2] =&gt; 3.00)

目前,我的模式不适用于FOC,只返回每个数组中的第一个。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我的建议是在正则表达式引擎尝试匹配数字之前添加\w+替代方法:

(?P<first>[^#]*)#(?P<second>\d{0,7}\.\d{1,2}|\w+)

或者,开始使用第一个非空白字符(demo)匹配键:

(?P<first>[^#\s][^#]*)#(?P<second>\d{0,7}\.\d{1,2}|\w+)
          ^^^^^^

请参阅regex demo

<强>详情

  • (?P<first>[^#]*) - Group&#34; first&#34;匹配除#以外的0 +字符(由于^[之后的第一个字符,因此这是一个否定的字符类)
  • # - #符号
  • (?P<second>\d{0,7}\.\d{1,2}|\w+) - Group&#34; second&#34;匹配
    • \d{0,7}\.\d{1,2} - 0到7位数后跟.,然后是1或2位数
    • | - 或
    • \w+ - 1个单词字符(字母,数字或_

请参阅PHP demo

$re = '/(?P<first>[^#]*)#(?P<second>(?:\d{0,7}\.\d{1,2}|\w+))/';
$str = 'Test 1#1.00 Test 2#2.00 Test 3#3.00
Test 1#1.00 Test 2#FOC Test 3#3.00';
preg_match_all($re, $str, $matches);
print_r($matches["first"]);
echo "\n";
print_r($matches["second"]);