php preg_replace分段错误/删除tr元素中的换行符(\ n)

时间:2014-01-09 13:12:45

标签: php regex

有谁能告诉我为什么这个正则表达式会导致php分段错误?

$text = preg_replace('~[\s\r\n]+(?=(?:(?!<tr).)*<\/tr>)~is', ' ', $text);

我需要删除\n\r元素中的换行符(tr)。也许有更好的正则表达式,或者可能有非正则表达式解决方案?

更新:

我只需要在tr元素中删除换行符。其他换行符应该不受影响。

UPDATE2:

我没有用正则表达式解析HTML。我正在收到电子邮件正文(它可以是没有表格的大型html,它可以是纯文本),删除tr中的换行符,剥离HTML标记和使用纯文本。

UPDATE3:

请不要回答“使用解析器”或downvote。我不认为它很适合这种情况,如果我错了,请解释我为什么错。我真的很赞成它。谢谢。

1 个答案:

答案 0 :(得分:2)

我认为preg_replace_callback()将是这项工作的最佳工具。试试这个:

$text = preg_replace_callback('#<tr.+?</tr>#is',
                              function($m){return preg_replace('/[\r\n]+/',' ',$m[0]);},
                              $text);