删除不在th或td内的所有换行符

时间:2015-04-24 12:45:22

标签: php regex

我正在制作一个基于一些预先存在的数据创建表格的插件。

有时,某些数据在中间有换行符(\ n或\ r \ n),这是我无法控制的。在我完成解析数据后,该软件将用<br>替换所有换行符,因此我需要删除不在<th><td>

内的所有换行符

此正则表达式将匹配所有这些(Fiddle):

(>[^<]*)\n([^<]*<)

如何使其与所有换行符匹配,<td></td><th></th>

内的换行符除外

谢谢

2 个答案:

答案 0 :(得分:1)

使用下面的正则表达式,然后用空字符串替换匹配的\n字符。

<(th|td)>.*?<\/\1>(*SKIP)(*F)|\n

<(th|td)>.*?<\/\1>匹配所有tdth标记。现在,以下(*SKIP)(*F)使匹配失败,然后尝试根据交替运算符旁边存在的模式与剩余字符串匹配字符。因此,它匹配tdth标记之外的所有新行标记。

DEMO

示例:

$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)

有一种更简单的方法(如果thtd代码之间没有标记):

\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>