正则表达式提取括号和结束字符串

时间:2011-02-28 12:05:44

标签: php regex

我正在开发一个使用抓取来收集数据的网络应用。我遇到了一个障碍,因为我不确定如何编写正则表达式来提取我需要的数据。

我需要从以下字符串中提取距离和等级。

"The Bet with the Tote 525 (A6) 525y"

等级为“A6”,距离为“525y”。

每隔一段时间,字符串中都有另一组括号,需要排除。例如,在这个字符串中:

"The Bet with the Tote (Starter race) Some more info (A6) 525y"

我需要第二组括号。等级和距离始终附加到描述的末尾,因此始终位于字符串的末尾。

我尝试过简单地使用substr()来获取字符串末尾的字符数,但是不时地将距离设置为类似“525yH”的东西,它完全抛出它。出于这个原因,我猜想正则表达式将是最好的选择。

非常感谢任何帮助。

扩展信息

  • 等级始终至少为2个字符。最多3个。
  • 成绩并不总是由字母和数字组成。
  • 成绩示例:
    • “A1”至“A10”
    • “T1”到“T10”
    • “或”
    • 许多其他字母/数字组合
  • 距离可以是米或码。
  • 距离始终为3个字符的整数,除“y”或“m”外:
  • 有时距离的末端有一个H,应该省略。

6 个答案:

答案 0 :(得分:1)

感谢更新问题,这很简单:

preg_match('/(\(\w+\)) (\w+)H?/', $str, $matches);

用法:

$str = "The Bet with the Tote 525 (A6) 525y";

print_r($matches);

输出:

Array
(
    [0] => (A6) 525y
    [1] => (A6)
    [2] => 525y
)

或:

$str = "The Bet with the Tote (Starter race) Some more info (A6) 525y";

print_r($matches);

输出:

Array
(
    [0] => (A6) 525y
    [1] => (A6)
    [2] => 525y
)

虽然我个人更喜欢爆炸方法的优雅,但它需要额外的条件和可能的操作来移除尾随的H.

答案 1 :(得分:1)

你可以尝试:

([^)]+) (\d+y.?)$

更具体一点

答案 2 :(得分:1)

如果数据模式是固定的,为什么不使用EXPLODE?

<?php

$str = "The Bet with the Tote 525 (A6) 525y";
$strArr = explode(" ",$str);
$arrCount = count($strArr);
$data1 = $strArr[$arrCount - 1];
$data2 = $strArr[$arrCount - 2];
echo $data1," , ",$data2;

?>

答案 3 :(得分:1)

  

等级和距离始终   附在说明书的末尾   总是在最后   字符串。

如下所示,没有正则表达式,可能会有效。也就是说,假设您的上述陈述是正确的。

$text = "The Bet with the Tote (Starter race) Some more info (A6) 525y";
array_slice(explode(" ", $text), -2, 2);

//returns
Array
(
    [0] => (A6)
    [1] => 525y
)

答案 4 :(得分:1)

$str = 'The Bet with the Tote 525 (A6) 525y';

preg_match_all('/.*\((?P<grade>.+?)\)\s(?P<distance>.+?)$/', $str, $matches);

var_dump($matches);

输出

array(5) {
  [0]=>
  array(1) {
    [0]=>
    string(9) "(A6) 525y"
  }
  ["grade"]=>
  array(1) {
    [0]=>
    string(2) "A6"
  }
  [1]=>
  array(1) {
    [0]=>
    string(2) "A6"
  }
  ["distance"]=>
  array(1) {
    [0]=>
    string(4) "525y"
  }
  [2]=>
  array(1) {
    [0]=>
    string(4) "525y"
  }
}

因此,您可以访问$matches['grade']$matches['distance']来访问成绩和距离。

更新

你的第二个字符串......

  

Bet with the Tote(入门种族)更多信息(A6)525y

输出

array(5) {
  [0]=>
  array(1) {
    [0]=>
    string(61) "The Bet with the Tote (Starter race) Some more info (A6) 525y"
  }
  ["grade"]=>
  array(1) {
    [0]=>
    string(2) "A6"
  }
  [1]=>
  array(1) {
    [0]=>
    string(2) "A6"
  }
  ["distance"]=>
  array(1) {
    [0]=>
    string(4) "525y"
  }
  [2]=>
  array(1) {
    [0]=>
    string(4) "525y"
  }
}

答案 5 :(得分:0)

尝试:

/.*?\((.*?)\)\W+(.*)$/