正则表达帮助,而不是找到我需要的东西

时间:2011-03-01 22:05:46

标签: php regex

我是一个新手试图在文本文件中搜索一些序列号。我正在使用PHP 5,我正在阅读CSV文件。我创建了以下正则表达式:

/^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/

我正在浏览一个相当大的文本文件,查找类似于下面列出的序列号:

37DB4B71-DAFA-4311-9AC6-0005646CB9BC

它总是找到第一个序列号,但它找不到任何其他序列号。还有至少15个人,对我做错了什么建议?我的印象是\ w会找到一个数字或数字的大小写敏感。我认为它找到了第一个实例。

这是我用来解析CSV文件的代码,我只是将整个文件放入并尝试按序列号将其拆分为数组。下面是我用来查看在执行任何其他操作之前是否至少可以拆分序列号的代码。现在它向我展示了一个包含1个项目的数组。那一项是序列号,后跟一堆文字和我需要的序列号。

还有一件事,我使用preg_split的原因是因为序列号后跟逗号,然后是序列号的一些细节。我试图使用Preg_split来破坏文件,因此文本将遵循序列号。

$searchPattern = '/^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/';
//Get the contents of the File
$contents = file_get_contents('C:/files/andrew1.csv'); 
if ($contents === false){
    echo 'Sorry, there was a problem reading the file.';
} else{
    $NoHTMLContents = strip_tags($contents);
    $splitContents = preg_split($searchPattern, $NoHTMLContents);
    echo '<pre>';
    print_r($splitContents);
    echo '</pre>';
}

2 个答案:

答案 0 :(得分:4)

如果你发布了你的代码会有所帮助,但我猜你需要使用preg_match_all代替preg_match,因为后者只返回第一个匹配。

您还应该记得使用PCRE_MULTILINE pattern modifier(m):

preg_match_all('/^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/m', $s, $matches);

查看在线工作:ideone


对于基于preg_split的方法,请尝试使用前瞻:

$matches = preg_split("/\n(?=\w{8}-\w{4}-\w{4}-\w{4}-\w{12})/m", $s);

查看在线工作:ideone

答案 1 :(得分:0)

我刚刚测试了你的正则表达式和你的序列号匹配。您可以使用PHP preg_match的this online tester。如果您发布其他序列号并且如果您在结尾处执行i之类的操作以指定忽略大小写,则会很好,

$regex = "/^\w{8}-\w{4}-\w{4}-\w{4}-\w{12}$/i";