preg_match_all - 匹配两个选项

preg_match_all - Match two options

preg_match 让我感到困惑,所以如果这是一个简单的问题或之前有人问过,我深表歉意,但我无法理解答案是否是我需要的。

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

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

所以最后得到

数组([0] => 测试 1 [1] => 测试 2 [2] => 测试 3 )

数组 ( [0] => 1.00 [1] => 2.00 [2] => 3.00 )

我正在努力的地方是改变模式以找到像现在这样的小数或 word/letters FOC 或 TBC

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

我的数组将是:

数组([0] => 测试 1 [1] => 测试 2 [2] => 测试 3 )

阵列([0] => 1.00 [1] => FOC [2] => 3.00 )

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

非常感谢任何帮助。

我的建议是在正则表达式引擎尝试匹配数字之前添加一个 \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>[^#]*) - 组 "first" 匹配除 # 以外的 0+ 个字符(由于 ^ 是第一个,因此这里是否定字符 class [)
  • 之后的字符
  • # - # 符号
  • (?P<second>\d{0,7}\.\d{1,2}|\w+) - 匹配的组 "second"
    • \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"]);