使用php从文本文件中提取多个字段

时间:2010-05-16 12:40:13

标签: php regex

使用php从文本文件中提取多个(~40个值)的最佳方法是什么?

数据或多或少像:

NAMEA                   valuea
NAMEB                   valueb

我正在寻找一种正确的方法来将这些数据提取到数据结构中,因为我需要为所有数据指定正则表达式(全部40个)。

我清楚了吗?

*意思是,默认/痛苦的方法将由我来做:

$namea = extractfunction("regexa", $textfilevalue);
$nameb = extractfunction("regeb", $textfilevalue);

...... 40次!


这些行可能不是相同的顺序,也不会出现在每个文件中。每个NAMEA都是这样的文本:“注册号码:”或“申请人姓名:”(即,我称之为NAMEA的空格)


对Col。

的回应

我正在寻找一种合理的编写代码的“方式”,因此它可读,可修改,构建一个易于调用的对象/数组等......“良好的编码风格!” :)


@Adam - 他们确实......并且还包含斜杠......


@Alix - 吓坏了!那很好!您是否也碰巧对如何通过删除“key_x”以及其他内容中的所有内容来“截断”rsultant数组有任何见解?我应该把它打开作为一个新问题吗?

3 个答案:

答案 0 :(得分:1)

以下是我的看法:

<强> somefile.txt:

NAMEA                   valuea
NAMEB                   valueb

PHP代码:

$file = file_get_contents('./somefile.txt');
$string = preg_replace('~^(.+?)\s+(.+?)$~m', '$1=$2', $file);
$string = str_replace(array("\r\n", "\r", "\n"), '&', $string);

$result = array();

parse_str($string, $result);

echo '<pre>';
print_r($result);
echo '</pre>';

<强>输出:

Array
(
    [NAMEA] => valuea
    [NAMEB] => valueb
)

您还可以在PHP 5.3 +上使用str_getcsv()进一步简化此操作。


编辑:对于有@Col空格的键,我以前的版本失败了。弹片注意到了。我没有足够的注意力阅读这个问题。一个可能的解决方案,因为您似乎使用了始终附加:的密钥是:

$string = preg_replace('~^(.+?):\s+(.+?)$~m', '$1=$2', $file);

要删除从key_x到文件末尾的所有内容,您可以执行以下操作:

$string = substr($string, 0, strpos($string, 'key_x'));

所以整件事情看起来像这样:

<强> somefile.txt:

Registration Number:                   valuea
Applicant Name:                   valueb

PHP代码:

$file = file_get_contents('./somefile.txt');
$string = substr($file, 0, strpos($file, 'key_x'));
$string = preg_replace('~^(.+?):\s+(.+?)$~m', '$1=$2', $string);
$string = str_replace(array("\r\n", "\r", "\n"), '&', $string);

$result = array();

parse_str($string, $result);

echo '<pre>';
print_r($result);
echo '</pre>';

<强>输出:

Array
(
    [Registration_Number] => valuea
    [Applicant_Name] => valueb
)

答案 1 :(得分:0)

据我所知,你可以使用file()获取一个字符串数组,然后用一些正则表达式解析这些字符串。

如果在名称和值之间添加=符号,您可以使用parse_ini_file()

立即获取整个内容

答案 2 :(得分:0)

假设您的密钥(名称,名称)中没有空格:

$contents = file('some_file.txt'); // read file as array
$data = array();
foreach($contents as $line) { // iterate over file
    preg_match('/^([^\s]+)\s+(.*)/', $line, $matches); // pull out key and value into $matches

    $key = $matches[1];
    $value = $matches[2];

    $data[$key] = $value; // store key/value pairs in $data array
}

var_dump($data); // what did we get?