我正试图纠正preg_match_all以匹配赛马距离。
我的来源将比赛列为: xmxfxy 我想匹配m值,f值,y值。然而,不同的种族可能只有m,或f,或y,或两个,甚至全部三个。
// e.g. $raw = 5f213y;
preg_match_all('/(\d{1,})m|(\d{1,})f|(\d{1,})y/', $raw, $distance);
以上类型的工作,但由于某种原因,匹配在返回的数组中出现在不可预测的位置。我想这是因为它为每个OR运行了3次匹配。如何在一次运行中匹配所有三个(可能存在或可能不存在)。
EDIT 完整的示例字符串是:
Hardings Catering Services Handicap (Div I) Cl6 5f213y
答案 0 :(得分:1)
如果我理解正确,您一次只能处理一个列表(如问题中的列表)。如果是这种情况,您应该使用preg_match
,而不是preg_match_all
,并且正则表达式应匹配整个“距离”代码,而不是单个组件。试试这个:
preg_match('#\b(?:(?<M>\d+)m|(?<F>\d+)f|(?<Y>\d+)y){1,3}\b#',
$raw, $distance);
结果现在存储在一维数组中,但无论如何都不需要担心组号;您可以通过名称访问它们(例如,$distance['M']
,$distance['F']
,$distance['Y']
)。
请注意,虽然此正则表达式将代码与一个,两个或三个组件匹配,但它不要求字母是唯一的。没有什么可以阻止它匹配像1m2m3m
这样的东西(顺便提一下你自己的方法所分享的弱点)。
答案 1 :(得分:0)
preg_match_all('/((\d{1,})m)?|((\d{1,})f)?|((\d{1,})y)?/', $raw, $distance);
答案 2 :(得分:0)
如果我理解你的问题是正确的,你想分别从这些值中得到每个数字吗?这对我有用:
$input = "Hardings Catering Services Handicap (Div I) Cl6 5f213y";
preg_match_all('/((\d+)(m|f|y))/', $input, $matches);
preg_match_all()
执行后,$matches[2]
包含匹配的数字数组(在这种情况下,$matches[2][0]
为5,$matches[2][1]
为213。
如果存在所有三个值,则m将位于$matches[2][0]
中,f位于$matches[2][1]
中,y位于$matches[2][2]
中。如果缺少任何值,则下一个值会增加一个点。它也可以派上用场$matches[3]
将保存匹配的相应字母的数组,因此如果你需要检查它是m,f还是y,你可以。
如果这不是您所追求的,请提供您希望为此输入或其他样本输入看到的输出示例。