0

我有一个正在阅读的文件,并在整个文件中搜索某种模式。这是示例行:

DATA "1354236384craan18p.1354236392craan18p.1354668684AR_ESCALATORCase HD0347023 was automatically closed on 5/12/2012 1:51:24 p.m.." "IT Services | File Services | Recovery"

我想要的是创建"IT Services | File Services | Recovery" 只给我该部分的正则表达式。

我有以下正则表达式和代码,但不起作用 - 有什么想法吗?

$whole_wk_file = file_get_contents('Work.arx');

$pattern1 = '/\"[^\"\|]+\|[^\"\|]+\|[^\"\|]+\"/';

preg_match_all($pattern1, $whole_wk_file, $matches_wk, PREG_PATTERN_ORDER);

print_r($matches_wk{0});

这又是在 PHP 中。

4

3 回答 3

0

试试这个你的正则表达式

'/"(([^"|]+\|){1,}[^"]+)"/'

文本将在每场比赛的第 1 组,甚至可能只是这一场

'/(?<=")(?:[^"|]+\|){1,}[^"]+(?=")/'

这将匹配没有任何组

于 2012-12-11T02:58:15.620 回答
0

好的,幸运的是 php 的多字节函数似乎支持 Windows-1252 字符编码。这就是我想出的..希望这有效

$whole_wk_file = file_get_contents('Work.arx');

$pattern1 = '/\"[^\"\|]+\|[^\"\|]+\|[^\"\|]+\"/';

mb_internal_encoding("Windows-1252");
mb_eregi($pattern1, $whole_wk_file, $matches_wk);

print_r($matches_wk);
于 2012-12-11T03:48:13.483 回答
0

您的正则表达式似乎找到了您想要的所有匹配项,但我在恰好包含两个管道 ( |) 的引用部分也得到了误报。您在评论中说,每场比赛都应该在其封闭行的末尾,所以添加一个锚应该解决这个问题:

'/"[^"|]+\|[^"|]+\|[^"|]+"[ ]*$/m'

m修饰符使$锚点能够在行边界处匹配,因为[ ]*文件的每一行似乎都以空格字符结尾。我可以\s*改用,但这会匹配换行符和空格。然后它必须马上把它们还给它们,这样锚 ( $) 才能完成它的工作。本着这种精神,完全排除换行符可能是值得的:

'/"[^"|\r\n]+\|[^"|\r\n]+\|[^"|\r\n]+"[ ]*$/m'

我还去掉了一堆不必要的反斜杠。

至于那些垃圾字符,我认为Kelly Copley是对的,这不是编码问题(或者如果是,修复它为时已晚)。它们似乎不会影响您关心的部分。

于 2012-12-11T06:50:11.077 回答