Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 解析大型文本字段_Php_Parsing - Fatal编程技术网

Php 解析大型文本字段

Php 解析大型文本字段,php,parsing,Php,Parsing,解析特定字符之间的字符串的最佳函数是什么 例如: 这是一场曲棍球比赛的boxscore,第一个名字是得分者,第二个名字是助攻 我只需要抓住一个在和之间的进球得分者 在和之间,需要$assist1 对于$assist2,在和之间添加 结果应该是: 最终我想制作一个大脚本,在那里我可以粘贴一堆BoxScore,并有一个循环运行,并将+1添加到玩家的目标/辅助列中。但现在,我想知道如何解析boxscore 非常感谢您的帮助 这里的内容将与您拥有的内容相匹配 用英语 ^起跑线 \w任何工作字符都包括a-

解析特定字符之间的字符串的最佳函数是什么

例如:

这是一场曲棍球比赛的boxscore,第一个名字是得分者,第二个名字是助攻

我只需要抓住一个在和之间的进球得分者

在和之间,需要$assist1

对于$assist2,在和之间添加

结果应该是:

最终我想制作一个大脚本,在那里我可以粘贴一堆BoxScore,并有一个循环运行,并将+1添加到玩家的目标/辅助列中。但现在,我想知道如何解析boxscore


非常感谢您的帮助

这里的内容将与您拥有的内容相匹配

用英语

^起跑线 \w任何工作字符都包括a-zA-Z_ \w+捕获,+不止一个 \这是一个单独的空间 -连字符 ?P命名的捕获组 \或\literal paren,与捕获项相对应。 $行尾
大部分只是重复这些,这是一个非常基本的正则表达式。

我觉得你在问两件事:1。如何处理boxscore的结果并筛选相关行;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的值,但我只是想说明一下,在这一点上,您可以使用这些值执行任何操作,您可以执行进一步的操作,或者将它们写入数组或其他内容,这似乎超出了问题的范围

正则表达式可能有点不雅观;它应该适用于奇怪的双筒和连字符姓氏


希望这有帮助!:

preg_match工作得很好,但可能更好的问题是您如何读取文件,文件内容?是要逐行解析数据,还是需要加载整个文件,这将对性能产生很大影响。我可能会制作一个表单,将boxscore粘贴到其中,并将其制作成字符串。不确定这是否是最明智的做法。该示例是您将粘贴的完整输入,还是仅粘贴在分数线中(如果这是准确的描述);e、 g:CHI-Kane Seabrook,Toews?@Darragh理想情况下,完整输入看起来很好,但是你会如何修改整个boxscore?整个boxscore是什么?CHI-Kane Seabrook,Toews第二CHI-Kane Seabrook,Toews第三CHI-Kane Seabrook,ToewsUm。如果你逐行读取,它将只匹配该格式的行。如果它是该格式,它将只匹配输入,因此如果你像在循环中一样逐行读取输入,那么你可以使用ifpreg_match'patt'、'input'、$match和match将包含你在匹配行上的信息。除非您需要的其他行中有数据,否则您可能需要执行}else,如果。。第二场比赛。。{这里的人真聪明!非常感谢Darragh!没问题!这就是我们来这里的目的。很高兴能帮忙!
$goalscorer = Kane
$assist1 = Seabrook
$assist2 = Toews
$str = "CHI - Kane (Seabrook, Toews)";      
preg_match('/^(\w+)\s-\s(?P<goalscorer>\w+)\s\((?P<assist1>\w+),\s(?P<assist2>\w+)\)$/', $str, $matches);
<?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`
    }
}