我该如何解析这样的数据?

时间:2012-02-25 19:56:24

标签: php regex parsing

我在养老院工作,他们想要在他们的网站上出现大量精选的经文。我收到了一份包含300多个文本的文本文档,并想了解一些如何导入数据而不是手工操作。

1. Matthew 8:1-4: Blah blah blah blah.
2. Mark 1:32-34: Blah blah. Blah, blah; blah.
.
.

关于我如何做到这一点的任何想法?我正在使用php。

例如,我需要每行两个数据:

Matthew 8:1-4:
Blah blah blah blah.

4 个答案:

答案 0 :(得分:2)

$matches = array();
preg_match('~^[0-9]+\. ([^0-9]+ (?:[0-9]+:)?[0-9]+-[0-9]+:) (.+)$~', trim($line), $matches);
var_dump($matches);

未经测试,但应该这样做。

答案 1 :(得分:1)

使用split()(或explode())执行您正在执行的操作。请注意,每行的格式化本身至关重要,因为这是寻找第一个.和第一个:,因此它会错误发现

1.Matthew 8: 1-4: Blah Blah Blah.

老实说,我认为你在这里使用正则表达式会更好。

$kvs = array();
$str = "
1. Matthew 8:1-4: Blah blah blah blah Blah: blah.
2. Mark 1:32-34: Blah blah. Blah, blah; blah.
3. Mark 2:2-4: Blah blah. Blah, blah; blah.
";

$split = split("\n", $str);
$c_split = count($split);

print_r($split);

for ($i = 0; $i < $c_split; $i++) {
    if (trim($split[$i]) != '') {
        $key = substr($split[$i], strpos($split[$i], '. ') + 2, strpos($split[$i], ': ') - 3);
        $value = substr($split[$i], strpos($split[$i], ': ') + 2);

        $kvs[$key] = $value;
    }
}

print_r($kvs);

http://codepad.org/hq2LkMlr

给你:

Array
(
    [0] => 
    [1] => 1. Matthew 8:1-4: Blah blah blah blah Blah: blah.
    [2] => 2. Mark 1:32-34: Blah blah. Blah, blah; blah.
    [3] => 3. Mark 2:2-4: Blah blah. Blah, blah; blah.
    [4] => 
)
Array
(
    [Matthew 8:1-4] => Blah blah blah blah Blah: blah.
    [Mark 1:32-34] => Blah blah. Blah, blah; blah.
    [Mark 2:2-4] => Blah blah. Blah, blah; blah.
)

答案 2 :(得分:0)

可以使用爆炸而不是正则表达式来完成:

$first_explosion = explode($line,".");
$interesting_data = $first_explosion[1]; #We ignore the number before the dot
$parsed_data = explode($interesting_data, ":",2); #Do just 2 "explodes", anything after the second ":" will be left alone
#$parsed_data is an array, element 0 is "Matthew 8", element 1 is "34-10", element 2 contains the rest

然后,您可以操作parsed_data数组,最终得到您需要的内容。

答案 3 :(得分:0)

分割每一行的简便方法可能是:

$yourObjectArray = explode(".", $theLine);
// now $yourObjectArray[0] is the line number, $yourObjectArray[1] is the content

然后你可以使用这样的函数找到最后的:并将其拆分。

function strlastpos($haystack, $needle) {   
  # flip both strings around and search, then adjust position based on string lengths 
  return strlen($haystack) - strlen($needle) - strpos(strrev($haystack), strrev($needle)); 
} 

$bookArray = split($yourObjectArray[1], strlaspost($yourObjectArray[1], ":"));
// now $bookArray[0] is your chapter/book information and $bookArray[1] is the content (blah blah)
可以在此处找到

explode文档 - http://www.php.net/manual/en/function.explode.php