【问题标题】:PHP Cant search for specific words in an array created from filePHP无法在从文件创建的数组中搜索特定单词
【发布时间】:2011-07-26 20:53:35
【问题描述】:

我一直在尝试从使用 php 中的 file() 函数从文本文件创建的数组中提取特定单词。

文本文件sample.txt是这样的:

A registration has been received. 

Name: test
Lastname: test2 
Email: test@test.com
Company/School: Test2
Company2: test3
Address1: test4
Address2: test5
City: test6
State: test7
Country: test8
Zipcode: test9

现在我已经使用 file() 函数将这个文本文件放入一个数组中。

$file_name='sample.txt';
$file_array=file($file_name);

然后我遍历循环以提取每个值并从该数组中搜索单词 say 'Name'。

    $data1='Name';

    foreach($file_array as $value){
    if(stripos($value,$data1)===FALSE)
        echo "Not Found";
     else 
       echo "Found";
    }

但它总是打印“未找到”。我曾尝试使用 strpos、strstr、preg_match 但无济于事。此外,如果我使用普通的单词数组而不是从文件创建,它可以正常工作。

提前致谢。

更新:我在这个问题上的目标是首先检测它是什么字段。 “名称”,然后是它的值 ex。 '测试'

【问题讨论】:

    标签: php arrays file text strpos


    【解决方案1】:

    这当然可能是行尾问题或文件编码问题,我也不确定 file() 是如何处理空格的。

    作为关于如何改进代码的建议,如果您自己从数据中创建一个键控数组,那么您可以使用更可靠的 array_key_exists() 函数来搜索您的字段。

    $file_name = 'sample.txt';
    $file_data = file($file_name);
    
    // loop through each line
    foreach ($file_data as $line) {
    
    // from each line, create a two item array
    $line_items = explode(":", $line);
    
    // build an associative (keyed) array
    // stripping whitespace and using lowercase for keys
    $file_array[trim(strtolower($line_items[0]))] = trim($line_items[1]);
    }
    

    现在您可以按如下方式使用array_key_exists:

    if (array_key_exists("name", $file_array) === false) {
      print "Not found.";
    } else {
      print "Found.";  
      // and now it's simple to get that value
      print "<br />Value of name:  " . $file_array['name'];
    }
    

    【讨论】:

    • 我会尝试使用 print_r($file_array) 并确定您的密钥的外观。
    • 我明白你的意思。所以键实际上是这样的数字“[2] => 名称:测试”。所以我可以通过指定一个数字来获取名称,在这种情况下它是“2”而不是“名称”。但在这种情况下,我必须先查看数组键,然后相应地更改值,因此如果在任何文本文件中更改“名称”的位置,我的脚本就会中断。但无论如何还是非常感谢,因为这现在可以工作。
    • 另外,我在这里并不是完全搜索字符串“名称”,而是查看位置并提取它的值,而无法检查它是否包含“名称”字段。
    • 好吧,我试图暗示你的是一个数组看起来像这样的情况:name => test,lastname => test2,email => test@test.com,等等。这样,冒号左侧的每个字符串都会成为数组中的一个键,因此可以使用 array_key_exists() 进行搜索。
    【解决方案2】:

    很可能您的数组中每个“行”的末尾仍有换行符。尝试像这样加载它:

    $file_array=file($file_name, FILE_IGNORE_NEW_LINES);
    

    【讨论】:

    • 基本上这个--> array(13) { [0]=> string(70) "ÿþA 注册已收到。" [1]=> string(1) "" [2]= > string(21) "姓名:test" [3]=> string(33) "Lastname:test2" .....contd.}
    • string(21) for "Name: test"?输入文件是 UTF-16 格式吗?您需要转换为 UTF-8 或使用 mb_stripos(多字节感知)字符串函数。
    • 试过 mb_stripos 但还是没用。实际上,我之前也尝试使用 $value=utf8_encode($value) 将每个值转换为 utf-8,但它也没有工作。
    • 我尝试了 mb_stripos 内部编码,比如 mb_stripos($value,$data1),还特别提到了 utf-8,比如 mb_stripos($value,$data1,"UTF-8")。对吗?
    • 是的,但 utf8_encode() 适用于 iso8859-1 -> utf8,您从 utf-16 开始。改用 mb_convert_encoding()。
    猜你喜欢
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-06
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多