1

我正在寻找可以帮助我解析 nquad 文件的 RegEx。nquad 文件是一个纯文本文件,其中每一行代表一个四边形 (s, p, o, c):

<http://mysubject> <http://mypredicate> <http://myobject> <http://mycontext> .
<http://mysubject> <http://mypredicate2> <http://myobject2> <http://mycontext> .
<http://mysubject> <http://mypredicate2> <http://myobject2> <http://mycontext> .

对象也可以是文字(而不是 uris),在这种情况下,它们用双引号括起来:

<http://mysubject> <http://mypredicate> "My object" <http://mycontext> .

我正在寻找一个给定该文件的一行的正则表达式,它将返回一个以下格式的 php 数组:

[0] => "http://mysubject"
[1] => "http://mypredicate"
[2] => "http://myobject"
[3] => "http://mycontext"

...或者在双引号用于对象的情况下:

[0] => "http://mysubject"
[1] => "http://mypredicate"
[2] => "My Object"
[3] => "http://mycontext"

最后一件事-在理想的世界中,正则表达式将满足各种组件之间可能存在1个或多个空格的情况,例如

<http://mysubject>     <http://mypredicate>  "My object"       <http://mycontext> .
4

3 回答 3

2

似乎可以按如下方式完成(我不知道您的字符限制,因此它可能无法专门满足您的需求,但适用于您的测试用例):

$line = "<http://mysubject> <http://mypredicate> <http://myobject> <http://mycontext>";
$line2 = '<http://mysubject> <http://mypredicate> "My object" <http://mycontext>';

// Remove unnecessary whitespace between entries (change $line to $line2 for testing)
$delimeter = '---';
$result = preg_replace('/([">]){1}\s+(["<]){1}/i', '$1' . $delimeter . '$2', $line);

// Explode on our delimeter
$array = explode( $delimeter, $result);
foreach( $array as &$a)
{
    // Replace the characters we don't want with nothing
    $a = str_replace( array( '<', '.', '>', '"'), '', $a);
}

var_dump( $array);
于 2011-11-02T06:33:09.333 回答
2

我将添加另一个答案作为仅使用正则表达式的附加解决方案并展开:

$line = "<http://mysubject> <http://mypredicate> <http://myobject> <http://mycontext>";
$line2 = '<http://mysubject> <http://mypredicate> "My object" <http://mycontext>';

$delimeter = '---'; // Can't use space
$result = preg_replace('/<([^>]*)>\s+<([^>]*)>\s+(?:["<]){1}([^">]*)(?:[">]){1}\s+<([^>]*)>/i', '$1' . $delimeter . '$2' . $delimeter . '$3' . $delimeter . '$4', $line);
$array = explode( $delimeter, $result);
于 2011-11-02T06:50:45.147 回答
0

这个正则表达式会有所帮助:

/(\S+?)\s+(\S+?)\s+(\S+?)\s+(\S+?)\s+\./

(s, p, o, c)值将在$1, $2, $3, $4变量中。

于 2011-11-02T06:13:11.770 回答