包装所有tr的正则表达式包含thead中的th标签

时间:2015-06-09 08:03:31

标签: php html regex preg-replace-callback

我遇到了正则表达式的问题,我需要将包含tr的所有th换行并将其放在thead中。我有一个变量$html,其中包含一个像这样的html表:

$html ="
<table>
<tr>
  <th>header1</th> 
  <th>header2</th>
  <th>header3</th>
</tr>
<tr>
  <th>header21</th> 
  <th>header22</th>
  <th>header23</th>
</tr>

<tr>
  <td>body1</td> 
  <td>body2</td>
  <td>body3</td>
</tr>
<tr>
  <td>body21</td> 
  <td>body22</td>
  <td>body23</td>
</tr>
</table>";

我写的正则表达式是这个

$html = preg_replace_callback(
'#(<tr.*?<th>.*?<th>.*?<\/tr>)#s', 
 function($match) {
        return '<thead>' . $match[0] . '</thead>';
    },
 $html);

但我得到的结果与我想要的不同。 现在,我将tr变为另一个thead

2 个答案:

答案 0 :(得分:0)

尝试使用正则表达式解析HTML不是一个好主意。

那就是说,你需要摆脱一个问号,这会给你无限但尽可能少的问号。对于第一个和最后一个<th>之间的空格,您希望它尽可能多。这将是诀窍:

              #this is supposed to be as greedy as possible
              #
~(<tr.*?<th>.*<th>.*?</tr>)~s

请参阅https://regex101.com/r/fR1xB5/1

答案 1 :(得分:0)

如果页面中有两个表格,最好尝试下面一个。

   (<tr>\s*(<th>((?!<tr>).)*</th>)+\s*</tr>)

例如:https://regex101.com/r/fR1xB5/2