2012-05-08 3 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答えはThx –

答えて

1

私は、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/VCt4fthis 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

に近いので、 '/ \ | [^ |] + /'を試してみてください。 –

0

それは我々が簡単にテーブルのようにしてエコーできるように、今、私たちはこの

のように、2次元配列構造を持ってちょうど2回の爆発と繰り返し

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

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

で正規表現を交換するために簡単かつ高速です

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

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

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

Thxですが、必要なものではありません。あなたは "\ n"記号を持つことができるテキストがたくさんあることが分かります。最初の爆弾を作ると、その内容も爆発します。とにかくthx –