2011-11-02 2 views
1

나는 nquad 파일을 구문 분석하는 데 도움이되는 RegEx를 찾고 있습니다.nquad의 구성 요소를 추출하는 PHP의 RegEx

<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) 일 수있다 :는 nquad 파일 (O, C, S, P)의 각 라인은 쿼드 나타내는 직선 텍스트 파일 따옴표 :에

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

... 나 :

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

나는 나에게 다음과 같은 형식으로 PHP 배열을 돌려 줄 것이다이 파일의 한 줄을 주어진 정규식, 찾고 있어요 큰 따옴표가있는 경우 개체에 대한 사용 :

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

마지막으로 일 - 이상적으로, 시나리오에 대한 수용 할 정규식 예를 들어, 다양한 구성 요소 사이에 하나 이상의 공백이있을 수 있습니다

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

을 : 만 정규식을 사용하여 별도의 솔루션으로 다른 대답을 추가하고 폭발/7976411/regex-in-php-to-nquad-nquad/7976708 # 7976708 – nickb

답변

2

을 http://stackoverflow.com/questions - 내가 필요한 문자열을 추출하는 데에만 정규식과`explode`를 사용하는 대답을 추가 한

$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

이 정규 표현식은 도움이 될 :

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

(s, p, o, c) 값이 $1, $2, $3, $4 변수에있을 것입니다.

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); 
+0

H mm, 내 리터럴이 '있을 수 있습니다.' 에 입력합니다. - str_replace를 사용하여 $ a에 할당하면 아무 것도 대체되지 않습니까? – robotrobot

+0

그렇기 때문에이 방법에 만족스럽지 않고 다른 답변에서 전체 작업을 수행하는 정규식을 만들었습니다. – nickb