0

そこで、モバイル サイト用にテーブルを div に変換するコードを少し書きました。

コードの抜粋を次に示します。

function replaceTables($table, $html) {

            $tempTable = preg_replace('/<table[^>]*>(.*?)<\/table>/is', '<div style="width: 90%; margin: auto;">$1</div><div style="clear: both;"></div>', $table);
            $html = str_replace($table, $tempTable, $html);

            preg_match_all('/(?!<table[^>]*>).*?<tr[^>]*>.*?<\/tr>.*?(?<!<\/table>)/is', $tempTable, $rows, PREG_OFFSET_CAPTURE);

            for ($i = 0; $i < count($rows[0]); $i++) {
                $tempRow = $rows[0][$i][0];

                preg_match_all('/(?!<table[^>]*>).*?<td[^>]*>.*?<\/td>.*?(?<!<\/table>)/is', $tempRow, $cols, PREG_OFFSET_CAPTURE);

                $numCols = count($cols[0]);
                $colWidth = 100/$numCols;

                for ($x = 0; $x < $numCols; $x++) {
                    $tempCol = $cols[0][$x][0];
                    $cols[0][$x][0] = preg_replace('/<td[^>]*>(.*?)<\/td>/is', '<div style="width: ' . $colWidth . '%; float: left;">$1</div>', $cols[0][$x][0]);
                    $tempRow = str_replace($tempCol, $cols[0][$x][0], $tempRow);
                }

                $tempRow = preg_replace('/<tr[^>]*>(.*?)<\/tr>/is', '<div style="clear: both;">$1</div>', $tempRow);
                $tempTable = str_replace($rows[0][$i][0], $tempRow, $tempTable);
            }

            $html = str_replace($table, $tempTable, $html);

            return $html;
        }

        if ($mobile && $page->type_id != 16) {
            // replace tables with divs for better mobile support

            preg_match_all('/<table[^>]*>.*?<\/table>/is', $this->html, $tables, PREG_OFFSET_CAPTURE);

            for ($y = 0; $y < count($tables[0]); $y++) {
                preg_match_all('/<table[^>]*>.*?<\/table>/is', $tables[0][$y][0], $nestedTables, PREG_OFFSET_CAPTURE);

                if (count($nestedTables[0]) > 0) {
                    //echo count($nestedTables[0]) . "<br />";
                    //print_r($nestedTables[0][0][0]);
                    for ($y = 0; $y < count($nestedTables[0]); $y++) {
                        $this->html = replaceTables($nestedTables[0][$y][0], $this->html);
                    }
                }
                $this->html = replaceTables($tables[0][$y][0], $this->html);
            }
            //$this->html = preg_replace('/<table[^>]*>(.*?)<\/table>/is', '<div style="width: 90%; margin: auto;">$1<div style="clear: both;"></div></div>', $this->html);
        }
        return $this->html;

ネストされたテーブルに問題があります。正規表現は、検索する必要があるテーブルタグではなく、最初に出現するテーブル終了タ​​グを検索しています。

誰かが私をより良い正規表現の方向に導くことができれば、またはテーブルを div に置き換える別の解決策に導くことができれば、それは素晴らしいことです。テンプレート化されたシステムをオーバーホールする必要がないように、解決策は文字列を操作することである必要があります。

ありがとう

4

2 に答える 2

1

多くの人が言っているように、正規表現を使用して HTML を解析することは、理想的な方法ではない可能性があります。それでも、何らかの理由でこのアプローチに縛られているという仮定の下で、私は少し調査を行って助けようとしました。

PHP が正規表現パターンの貪欲さを解釈する方法に関連する問題が発生しているようです。多くの量指定子を使用していることがわかります?。これにより、貪欲でない検索が実行される可能性があります ( http://php.net/manual/en/reference.pcre.pattern.modifiers.少なくともphp )。U正規表現パターンの一部またはすべてで修飾子を使用することで、これを修正できる可能性があります。これにより貪欲さが逆転し、?量指定子が再び貪欲になる可能性があります。

とは言っても、そこには複雑な正規表現チェックのセットがあるため、意図しない動作を引き起こす可能性は間違いなくあります. テストして確認することをお勧めします。

参考までに、いくつかの場所で行ったのと同じように、正規表現Uの終了後に修飾子を配置して呼び出します。/is

于 2012-09-25T20:34:22.870 に答える