php正则表达式 - 模式不正确没有得到理想的结果

时间:2012-12-11 02:20:24

标签: php regex

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

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。

3 个答案:

答案 0 :(得分:0)

试试这个正则表达式

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

文本将在每场比赛的第1组中,或者甚至只是这一个

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

将在没有任何组的情况下匹配

答案 1 :(得分: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);

答案 2 :(得分:0)

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

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

m修饰符授权$锚点在行边界处匹配,[ ]*就在那里,因为文件的每一行似乎都以空格字符结尾。我可以使用\s*代替,但这会匹配换行符和空格。然后它必须立即给它们,所以锚($)可以完成它的工作。本着这种精神,完全排除新行可能值得你花时间:

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

我也摆脱了一堆不必要的反斜杠。

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