我正在制作一个基于一些预先存在的数据创建表格的插件。
有时,某些数据在中间有换行符(\ n或\ r \ n),这是我无法控制的。在我完成解析数据后,该软件将用<br>
替换所有换行符,因此我需要删除不在<th>
或<td>
此正则表达式将匹配所有这些(Fiddle):
(>[^<]*)\n([^<]*<)
如何使其与所有换行符匹配,<td></td>
和<th></th>
谢谢
答案 0 :(得分:1)
使用下面的正则表达式,然后用空字符串替换匹配的\n
字符。
<(th|td)>.*?<\/\1>(*SKIP)(*F)|\n
<(th|td)>.*?<\/\1>
匹配所有td
或th
标记。现在,以下(*SKIP)(*F)
使匹配失败,然后尝试根据交替运算符旁边存在的模式与剩余字符串匹配字符。因此,它匹配td
和th
标记之外的所有新行标记。
示例:强>
$string = <<<EOT
<table>
<tr><th>HEader 1</th><th> header
2</th>
</tr>
<tr><td>cell
content</td><td>cell 2</td></tr>
</table>
EOT;
echo preg_replace('~<(th|td)>.*?<\/\1>(*SKIP)(*F)|\n~s', '', $string);
<强>输出:强>
<table><tr><th>HEader 1</th><th> header
2</th></tr><tr><td>cell
content</td><td>cell 2</td></tr></table>
参考:
答案 1 :(得分:1)
有一种更简单的方法(如果th
和td
代码之间没有标记):
\n(?!.*?<\/(?:th|td)>)
如果中间有标签,您可以使用Avinash的方法,或者也使用(*SKIP)(*FAIL)
技巧的方法,但允许使用任意数量的属性:
(?s)<(t[hd])[^>]*?>.*?<\/\1>(*SKIP)(*FAIL)|\n
请参阅demo。
输入为
<table>
<tr><th>HEader 1</th><th> header
2</th>
</tr>
<tr><td width="100"><b>cell
content</b></td><td>cell 2</td></tr>
</table>
输出
<table><tr><th>HEader 1</th><th> header
2</th></tr><tr><td width="100"><b>cell
content</b></td><td>cell 2</td></tr></table>