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"]);
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"]);