因此,我编写了一小段代码来为我们的移动网站将表格转换为 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 替换表格,那就太好了。解决方案必须是通过操作字符串,这样就不必对我们的模板系统进行大修。
谢谢