如何使用 preg_replace 仅在 HTML 标记内删除新行?
例子:
<table>
<tr>
<td></td>
</tr>
</table>
Text here. Text here
Text here.
因此,在函数处理完上述代码后,返回应该是:
<table> <tr> <td></td> </tr> </table>
Text here. Text here
Text here.
如何使用 preg_replace 仅在 HTML 标记内删除新行?
例子:
<table>
<tr>
<td></td>
</tr>
</table>
Text here. Text here
Text here.
因此,在函数处理完上述代码后,返回应该是:
<table> <tr> <td></td> </tr> </table>
Text here. Text here
Text here.
如何使用 preg_replace 仅在 HTML 标记内删除新行?
从技术上讲是的,但实际上,HTML 并不关心换行符,每个多个空白字符实际上都被读取为一个。如您的示例所示,您将 \n 替换为空格或 \t,因此实际上是相同的,这使我想到您可以执行以下操作:
$html = preg_replace('~(>[^>]*)(*BSR_ANYCRLF)\R([^<]*<)~', '$1 $3', $html);
另请参阅:php regex to match outside of html tags和How to replace different newline styles in PHP the smartest way?.
一种更安全的方法是使用 HTML 解析器,DOMDocument
并将您的片段作为正文加载。然后替换正文子节点的子节点的文本节点中的所有换行符。
可能有更聪明的方法可以做到这一点,但是,这将完成你的工作。
$str = "test\n\n test2 <table>\n\n\n test 3</table>\n\n\n test4 test5";
while ($str2 = preg_replace('/(>[^<]*)\n([^<]*<)/', '\\1\\2', $str)) {
if ($str2 == $str) break;
$str = $str2;
}
echo ($str);
它在 > 字符和 < 字符之间查找换行符,并删除它们。