0

我正在尝试纠正 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 次比赛。如何在一次运行中匹配所有三个(可能存在也可能不存在)。

编辑一个完整的示例字符串是:

Hardings Catering Services Handicap (Div I) Cl6 5f213y
4

3 回答 3

1

如果我对您的理解正确,您正在一次处理一个列表(如您问题中的列表)。如果是这种情况,您应该使用preg_match, not 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(顺便说一下,这是你自己的方法所共有的弱点)。

于 2010-08-18T05:22:44.917 回答
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 将为 in $matches[2][0]、 f in$matches[2][1]和 y in $matches[2][2]。如果缺少任何值,则下一个值会增加一个位置。它也可能派上用场,$matches[3]它将保存一个匹配的相应字母的数组,因此如果您需要检查它是 m、f 还是 y,您可以。

如果这不是您所追求的,请提供您希望为此或其他示例输入看到的输出示例。

于 2010-08-18T01:17:22.213 回答
0

您可以使用 ”?” 作为有条件的

preg_match_all('/((\d{1,})m)?|((\d{1,})f)?|((\d{1,})y)?/', $raw, $distance);
于 2010-08-17T14:29:22.290 回答