2010-03-04 89 views
2

我有另一个csv文件,我试图做一个简单的词过滤器。例如,我的text.csv文件看起来像这样:使用php过滤一个csv文件的文字或文本使用php

name, age, hobbies 
Tom, 8, "football, soccer, baseball, wii, star wars, books" 
Bill, 9, "football, baseball, ice hockey, basketball" 
Sue, 8, "baseball, soccer, volleyball, bicycles, skating" 
Mike, 8, "basketball, music, guitar, cartoons, books" 
Ella, 9, "soccer, basketball, softball, clothes, books" 
Tim, 9, "football, baseball, basketball, wii, cartoons" 
Steven, 8, "baseball, soccer, star wars, cartoons, books" 

我想过滤第三列。例如,如果我被过滤“的Wii”我会行1和6发回:

Tom, 8, "football, soccer, baseball, wii, star wars, books" 
Tim, 9, "football, baseball, basketball, wii, cartoons" 

如果我通过“Wii的”或“吉他”过滤我会行1,4和6送回。

Tom, 8, "football, soccer, baseball, wii, star wars, books" 
Mike, 8, "basketball, music, guitar, cartoons, books" 
Tim, 9, "football, baseball, basketball, wii, cartoons" 

我不擅长PHP和数组,但我已经试过的preg_match瞎搞 - 但不能肯定是否类似strpos更好。以下是我所做的,但不能让它正常工作:

<?PHP 
$firstWord = 'wii'; 
$secondWord = 'guitar'; 
$file = fopen('text.csv', 'r'); 
while (($line = fgetcsv($file)) !== FALSE) 
{ 
list($name[], $age[], $hobbies[]) = $line; 
if (preg_match($firstWord, $hobbies[0]) || (preg_match($secondWord,  $hobbies[0]) { 
echo $name . ',"' .$age . '",' .$hobbies . "<br> \n"; 
} else { 
    echo "A match was not found.<br> \n"; 
}} 
?> 

任何编码帮助表示赞赏。搜索不区分大小写也是很好的做法。谢谢阅读!

回答

6

你很近。像这样的东西应该工作:

$file = fopen('text.csv', 'r'); 

// You can use an array to store your search words, makes things more flexible. 
// Supports any number of search words. 
$words = array('wii', 'guitar');  
// Make the search words safe to use in regex (escapes special characters) 
$words = array_map('preg_quote', $words); 
// The argument becomes '/wii|guitar/i', which means 'wii or guitar, case-insensitive' 
$regex = '/'.implode('|', $words).'/i'; 

while (($line = fgetcsv($file)) !== FALSE) { 
    list($name, $age, $hobbies) = $line; 

    if(preg_match($regex, $hobbies)) { 
     echo "$name, $age, $hobbies<br />\n"; 
    } 
} 
+0

谢谢,我得到了一个'{'错误,但后来我改变了最后一行,在preg_match的末尾添加了第二个')'。非常棒,感谢Tatu!我该如何让搜索大小写不敏感,以便搜索“吉他”还是“吉他”并不重要? – Thomas 2010-03-04 21:35:45

+1

@Thomas:'$ regex ='/'。implode('|',$ words)。'/ i';'使用不区分大小写的标志** i ** – jasonbar 2010-03-04 22:03:47

+0

非常感谢jasonbar。你们都大大帮助了我。非常感激。 – Thomas 2010-03-04 22:31:36

0

大小写不敏感的搜索怎么样。我很想让这个工作在我的Outlook联系人列表中显示。有没有比strtolower()更好的函数?

0

这里可能值得注意的是PHP有CSV处理库。

http://php.net/manual/en/function.fgetcsv.php

这返回CSV的下一行作为阵列例如

// csv file contains "col1,col2,col3" 
// array = {'col1', 'col2', 'col3'} 
$array = fgetcsv($csv); 

然后就可以简单地使用in_array()或$阵列上[COLUMN_NUMBER栏]测试进行筛选。

我不知道如果使用正则表达式的行字符串与使用数组搜索功能会更快,所以它可能值得测试。