RegEx в PHP для извлечения компонентов nquad - PullRequest
1 голос
/ 02 ноября 2011

Я ищу RegEx, который может помочь мне разобрать файл nquad.Файл 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> .

Ответы [ 3 ]

2 голосов
/ 02 ноября 2011

Похоже, что это может быть выполнено следующим образом (я не знаю ограничений вашего персонажа, поэтому он может не сработать специально для ваших нужд, но сработал для ваших тестовых случаев):

$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);
2 голосов
/ 02 ноября 2011

Я собираюсь добавить еще один ответ в качестве дополнительного решения, используя только регулярное выражение и взорвать:

$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);
0 голосов
/ 02 ноября 2011

Это регулярное выражение поможет:

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

(s, p, o, c) значения будут в $1, $2, $3, $4 переменных.

...