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> .

オブジェクトは (URI の代わりに) リテラルにすることもできます。その場合、それらは二重引用符で囲まれます。

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

このファイルの 1 行を指定する正規表現を探しています。これにより、次の形式の 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 つ - 理想的な世界では、正規表現はさまざまなコンポーネント間に 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>';

$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 に答える
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 に答える
0

この正規表現は役に立ちます:

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

(s, p, o, c)値は$1, $2, $3, $4変数になります。

于 2011-11-02T06:13:11.770 に答える