我有一个包含以下内容的文本文件:
---> 12455 ---> 125 ---> KKK
---> 11366 ---> 120 ---> LLL
---> 12477 ---> 120 ---> YYY
我使用以下PHP代码在文件中搜索“---> 124”,我得到以下结果:
---> 12455 ---> 125 ---> KKK
---> 12477 ---> 120 ---> YYY
但我希望结果如下:
---> 12455
---> 12477
我希望它只返回第一列。
<?php
$file = 'mytext.txt';
$searchfor = '---> ' . "124";
// the following line prevents the browser from parsing this as HTML.
header('Content-Type: text/plain');
// get the file contents, assuming the file to be readable (and exist)
$contents = file_get_contents($file);
// escape special characters in the query
$pattern = preg_quote($searchfor, '/');
// finalise the regular expression, matching the whole line
$pattern = "/^.*$pattern.*\$/m";
// search, and store all matching occurences in $matches
if(preg_match_all($pattern, $contents, $matches)) {
echo implode($matches[0]);
} else {
echo "No matches found";
}
?>
答案 0 :(得分:2)
首先,分开你的担忧:
使用迭代器,你可以在这里实现一些很棒的东西,但是需要更深入地了解OOP和迭代器接口。我建议的是一种更简单的方法:
<?php
//Read the file line by line
$handle = fopen('file.txt', 'r');
while(!foef($handle)){
$content = fgets($handle);
//Parse the line
$content = explode('---> ', $content);
//Analyse the line
if($content[1] == 124){
echo $content[0]."\n";
}
}
fclose($handle);
那应该是它,只是按照你的意愿调整它,我还没有在这里测试代码!
答案 1 :(得分:2)
稍微改变一下你的方法。不要将搜索词和分隔符存储在单个字符串中,而是使用两个变量。
$sep = '--->';
$searchfor = '124';
$pattern = "/^$sep\s+($searchfor\d+)\s+.*/m";
// search, and store all matching occurences in $matches
if(preg_match_all($pattern, $contents, $matches)){
echo implode(' ', $matches[1])."\n";
}
输出:
12455 12477
答案 2 :(得分:1)
如果结构总是如您所示,那么:
explode();
每行按空格
; [1]
; 这似乎对我来说是最符合逻辑的。此处不需要regex
,因为它比简单的explode
操作更慢。
以下是一个例子:
$handle = fopen( 'file.txt', 'r' );
if ( $handle ) {
while ( ( $line = fgets( $handle ) ) !== false ) {
$matches = explode( ' ', $line );
if ( $matches[4] == '124' )
echo $matches[1] . '<br/>';
}
}
答案 3 :(得分:1)
将"/^.*$pattern.*\$/m"
更改为"/$pattern\d*/i"
然后echo implode($matches[0]);
改为foreach($matches[0] as $item) echo "$item<br />\r\n";
答案 4 :(得分:0)
试试这个:
--->\s\d{5}
正则表达式在这里有点过分,一个简单的explode('--->', $str)
并选择第一个元素就足够了
答案 5 :(得分:0)
$file = file_get_contents('file.txt');
$lines = explode('---> ', $file);
for($i=1; $i<count($lines); $i=$i+3)
if(strpos($lines[$i], '124')!==false)
$col[$i/3] = /*'--> ' . */$lines[$i];
print_r($col);
这似乎工作得很好。如果您想要 - &gt;取消注释以上评论包含在输出中。此外,生成的$ col数组将使用找到的行号进行索引。如果你不想要,只需用[]替换[$ i / 3]。
进一步说明:
function SearchFileByColumn($contents, $col_num, $search, $col_count = 3) {
$segs = explode('---> ', $contents);
for($i=$col_num; $i<count($segs); $i=$i+$col_count)
if(strpos($segs[$i], $search) !== false)
$res[] = $segs[$i];
return $res;
}
$results = SearchFileByColumn($contents, 1, '124');