解析大文本字段

时间:2015-08-03 23:10:16

标签: php parsing

在某些字符之间解析字符串的最佳函数是什么?

例如:

CHI 3 - MIN 0

1st
CHI - Kane (Seabrook, Toews)

2nd
CHI - Kane (Seabrook, Toews)

3rd
CHI - Kane (Seabrook, Toews)

所以这是一个曲棍球比赛的比分,第一个名字是射手,第二个是助攻。

我只需要在“ - ”和“(”对于$ goalcorer

之间抓住

在“(”和“,”之间为$ assist1

在$ help2

之间添加“,”和“)”

结果应为:

$goalscorer = Kane
$assist1 = Seabrook
$assist2 = Toews

最终我想制作一个大脚本,我可以粘贴一堆盒子,并循环运行并向玩家目标/辅助列添加“+1”。但就目前而言,我想知道如何解析分数。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:3)

这将与您拥有的相匹配

https://regex101.com/r/yT7aW7/1

$str = "CHI - Kane (Seabrook, Toews)";      
preg_match('/^(\w+)\s-\s(?P<goalscorer>\w+)\s\((?P<assist1>\w+),\s(?P<assist2>\w+)\)$/', $str, $matches);

英文

  • ^行首
  • \w任何工作角色都包含a-zA-Z _
  • ( \ w + )捕获,+多一个
  • \s单个空格
  • -连字符
  • ?P<name>指定的捕获组
  • \(\)字面上的paren,正如捕获的那样。
  • $行尾

大多数只是重复那些,这是一个非常基本的正则表达式。

答案 1 :(得分:1)

在我看来,你在问两件事:1。如何处理你的盒子比分的结果并过滤相关的线条; 2.从相关行中提取特定值。

假设您的boxscore可用作名为$str的变量,您可以在其换行符上展开它,迭代结果,过滤所需的行,然后从这些行中提取值。

这样的东西非常机械,但是应该可行,给出上面的示例输入:

<?php

$str = <<<STR
CHI 3 - MIN 0

1st
CHI - Kane (Seabrook, Toews)

2nd
CHI - Kane (Seabrook, Toews)

3rd
CHI - Kane (Seabrook, Toews)
STR;

// split boxscore input on newlines
// to create an array of lines
$lines = explode(PHP_EOL, $str);

// iterate over lines
// filter each line... ignore zero-length lines
// check if the last char is ')'
// preg_split on filtered lines
// assign to vars
// etc.
foreach ($lines as $line) {
    $len = strlen($line);
    if ($len && $line[$len - 1] === ')') {
        $matches = preg_split('/^\w{3}\s+-\s+|\s+\(|,\s+|\)/', $line, null, PREG_SPLIT_NO_EMPTY);
        list($goalscorer, $assist1, $assist2) = $matches;
        // do whatever you want with `$goalscorer`, `$assist1`, `$assist2`
    }
}

当然,每次迭代都会覆盖$goalscorer$assist1$assist2的值,但我只是说明此时您可以使用这些值执行任何操作,可以做进一步的操作或将它们写入数组或其他东西 - 这似乎超出了现在问题的范围。

正则表达式可能有点不雅;它适用于奇怪的双管和带连字符的姓氏。

希望这有帮助! :)