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()何か助けてください?ありがとう。

4

3 に答える 3

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/VCt4f (この質問を使用)。これにより、次のようになります。

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
    }
}
于 2012-05-08T14:01:29.997 に答える
0

「|」でexplode()関数を使用してみてください そして""(スペース)そしてそれをそのように解析します。それ以外は、他の方法は考えられません。

$exploded = explode("|", $table);
$exploded = explode(" ", $table);
于 2012-05-08T13:32:53.990 に答える
0

正規表現を2回の爆発と反復で交換するだけで、より簡単で高速です

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

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

これで、次のようにテーブルとして簡単にエコーアウトできるように、2D 配列構造ができました。

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

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

    echo "</tr>";
}
echo "</table>";
于 2012-05-08T13:44:05.887 に答える