2012-05-08 4 views
0

데이터베이스 테이블을 나타내는 복잡한 문자열이 있습니다. 그리고 그들을 처리하기 위해 데이터베이스 테이블을 따로 추출해야합니다.문자열 같은 구문 분석 테이블

First table 
    | | {{Категория}} | | {{Стоимость курсов}} | {{Стоимость учебного набора}} | 
    | 1 | Взрослый | 1 уровень = 50ч | 1~500 лей | 15 евро | 
    | 2 | Студент, Мастерант, Докторант | 1 уровень = 50ч | 1~000 лей | 15 евро | 
    | 3 | Ученик | 1 уровень = 50ч | 1~000 лей | 15 евро | 
    | 4 | Пенсионер | 1 уровень = 50ч | 1~000 лей | 15 евро | 
text text text text text text 
    Second table: 
     | | {{Вид курсов}} | | {{Стоимость курсов}}| {{Стоимость учебного набора}} | 
     | 1 | dfgdfgdfg | 1 модуль | 500 лей | 0 | 
     |^|^| 2 модуля | 900 лей | 0 | 
     |^|^| 4 модуля | 1~500 лей | 0 | 
     | 2 | fgdfgdfg | 12ч | 800 лей | 0 | 
     | 3 | dfgdfgdfgdfg| 12ч | 900 лей | 0 | 
     |^|^| Предварительный тест | 400 лей | 0 | 
text text text text text text 

나는이 정규 표현식 사용하여 시도 : \|.+하지만 preg_match_all() 단순히 배열에 분리되지 않은 모든 테이블을 덤프를

다음은 문자열의 예입니다. 도움이 필요하십니까? 감사.

+0

와 열로 분할 할 수 테이블을 추출을 완료, JSON? –

+0

'\ |. +'는 파이프 ('|')와 일치하고 임의의 수의 문자 ('. +')와 일치합니다. – Znarkus

+0

@MattBall이 형식은 –

답변

1

내가 알기로 한 문자열 내에 테이블 세트가 있습니다. 그리고 문자열을 테이블로 분할해야합니다. 난 당신이 텍스트를 분리 테이블을 분리 수 있다고 가정합니다.

<?php 
$s = <<<EOSTR 
First table 
    | | {{Категория}} | | {{Стоимость курсов}} | {{Стоимость учебного набора}} | 
    | 1 | Взрослый | 1 уровень = 50ч | 1~500 лей | 15 евро | 
    | 2 | Студент, Мастерант, Докторант | 1 уровень = 50ч | 1~000 лей | 15 евро | 
    | 3 | Ученик | 1 уровень = 50ч | 1~000 лей | 15 евро | 
    | 4 | Пенсионер | 1 уровень = 50ч | 1~000 лей | 15 евро | 
text text text text text text 
    Second table: 
     | | {{Вид курсов}} | | {{Стоимость курсов}}| {{Стоимость учебного набора}} | 
     | 1 | dfgdfgdfg | 1 модуль | 500 лей | 0 | 
     |^|^| 2 модуля | 900 лей | 0 | 
     |^|^| 4 модуля | 1~500 лей | 0 | 
     | 2 | fgdfgdfg | 12ч | 800 лей | 0 | 
     | 3 | dfgdfgdfgdfg| 12ч | 900 лей | 0 | 
     |^|^| Предварительный тест | 400 лей | 0 | 
text text text text text text 
EOSTR; 

$a = null; 
$a = preg_split('/^(?:.(?<!\|))*$/xm', $s); 
var_dump($a); 

그냥 여기에 같은

: http://ideone.com/VCt4f ( this question 사용). 이것은 당신에게 줄 것이다이 :

array(5) { 
    [0]=> 
    string(0) "" 
    [1]=> 
    string(506) " 
    | | {{Категория}} | | {{Стоимость курсов}} | {{Стоимость учебного набора}} | 
    | 1 | Взрослый | 1 уровень = 50ч | 1~500 лей | 15 евро | 
    | 2 | Студент, Мастерант, Докторант | 1 уровень = 50ч | 1~000 лей | 15 евро | 
    | 3 | Ученик | 1 уровень = 50ч | 1~000 лей | 15 евро | 
    | 4 | Пенсионер | 1 уровень = 50ч | 1~000 лей | 15 евро | 
" 
    [2]=> 
    string(1) " 
" 
    [3]=> 
    string(466) " 
     | | {{Вид курсов}} | | {{Стоимость курсов}}| {{Стоимость учебного набора}} | 
     | 1 | dfgdfgdfg | 1 модуль | 500 лей | 0 | 
     |^|^| 2 модуля | 900 лей | 0 | 
     |^|^| 4 модуля | 1~500 лей | 0 | 
     | 2 | fgdfgdfg | 12ч | 800 лей | 0 | 
     | 3 | dfgdfgdfgdfg| 12ч | 900 лей | 0 | 
     |^|^| Предварительный тест | 400 лей | 0 | 
" 
    [4]=> 
    string(0) "" 
} 

당신이 단순히 왜 그냥 말, 같은 제정신/기존 형식을 사용하지 않는

// $a = preg_split... 

foreach ($a as $table) { 
    if (!strlen(trim($table))) 
     continue; 

    $rows = preg_split('/\n/', $table); 

    foreach ($rows as $row) { 
     if (!strlen(trim($row))) 
      continue; 

     $columns = preg_split('/\|/', $row); 

     // work with $columns array 
    } 
} 
+0

thx, 그게 도움이! –

0

"|"에 explode() 기능을 사용해 볼 수 있습니다. 와 ""(공백)을 구분하고 그런 식으로 구문 분석합니다. 그 외의 경우, 나는 다른 방법을 생각할 수 없습니다.

$exploded = explode("|", $table); 
$exploded = explode(" ", $table); 
+0

이므로 더 가깝지만 같지 않으므로'/ \ | [^ |] + /'을 시도하십시오. thx –

0

그것은 간단하고 우리가 쉽게

처럼 테이블로 밖으로 반향 할 수 있도록 빠른 단지 반복

$table = array(); 
$rows = explode("\n", $string); 

foreach($rows as $row) 
    $table[] = explode("|", $row); 

이제 우리는 2 차원 배열 구조를 가지고있는 두 개의 폭발과 함께 정규 표현식과 교환을

echo "<table>"; 
foreach($table as $row) { 
    echo "<tr>"; 

    foreach($row as $column) 
     echo "<td>$column</td>"; 

    echo "</tr>"; 
} 
echo "</table>"; 
+0

대답은 Thx이지만, 필요한 것은 아닙니다. "\ n"기호를 가질 수있는 텍스트가 많이 있다는 것을 알 수 있습니다. 첫 번째 폭발음을 내면 그 내용도 폭발합니다. 하지만 어쨌든 thx –