所以我有一些字符串(这是一小段代码),看起来类似于:
L L L LIL5LSOLSLQLL AL
BL
B6LLALBLYLL69L6KL6L6L7LLLLLLHZLMhuLPLHILHLHLILILQZLSoLULWLXL4L4L>LZLL
L
LoLzLVLVLLLLLLLDLeLkLLaLLLLLLL5M 5string1:string2:(RANDOM):string3:(RANDOM)R<baseversion><version>0000000297000000025309458093771<version><baseversion> BLYLL69L6KL6L6L7LLLL
我希望提取符合模式的所有字符串:
string1:string2:[A-Za-z0-9]:string3:[A-Za-z0-9]
注意:整篇文章中有很多内容;但每次换行时只能找到一个,但不是每行都有。
任何指导都会受到很大关注:)
答案 0 :(得分:0)
我不完全确定你想要提取什么,但是以下(未经测试)将仅提取整个匹配以及baseversion。
$handle = fopen('/path/to/file.txt', "r");
while (!feof($handle)) {
$line .= fread($handle, 8192);
if (preg_match('/string1:string2:.+?:string3:.+?R<baseversion><version>(.+?)<version><baseversion>/', $line, $matches)) {
print 'Match: '.$matches[0]."\n";
print 'Version: '.$matches[1]."\n";
}
}
fclose($handle);
模式.*?
是有趣的部分。尽管.*
匹配的次数尽可能多,但.*?
只会尽可能少地匹配。假设字符串是“xaaay”,那么模式/ xa + /匹配“xaaa”而/ xa +?/匹配“xa”。 (这个?
的技术术语是“贪婪”。在文档中查看,ppl经常使用像lookahead这样的东西,因为他们不知道贪婪。)
我写了一张可能派上用场的备忘单:
http://www.bitcetera.com/en/techblog/2008/04/01/regex-in-a-nutshell/
作为旁注:[A-Za-z0-9]
与随机字符不匹配,例如与“%”不匹配。
答案 1 :(得分:0)
听起来像你想要的那样:
/string1:string2:[A-Za-z0-9]+:string3:[A-Za-z0-9]+(?=R<baseversion>)/
您可以在此处使用命名组而不是前瞻,但这应该可以完成工作。此外,不确定您是否需要这些+
符号,因为您的样本正则表达式没有它们。我有点猜测(RANDOM)位是什么样的。
请注意,此处的重点是捕获从string1
到但不包括 R<baseversion>
的所有内容。看起来这就是你所要求的。