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,只返回每个数组中的第一个。
非常感谢任何帮助。
答案 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"]);