【问题标题】:Regex that removes newlines between tags删除标签之间换行符的正则表达式
【发布时间】:2013-05-27 00:32:56
【问题描述】:

我追求一种在标签之间进行选择时始终将所有内容放在一行中的模式。在这种情况下,我希望 <ul> 标记中的所有内容都放在一行上。我在整个 stackoverflow 中尝试了一些,但到目前为止都没有成功。

<ul>
<li>
<span><span><span>Manager</span></span></span>
</li>
<li>
<span><span><span>physical</span></span></span>
</li>
<li>
<span><span><span>transport
</span></span></span>
</li>
<li>
<span>
<span><span>    Australia</span></span></span>
</li>
</ul>

预期:

 <ul><li><span><span><span>Manager</span></span></span></li><li><span><span><span>physical</span></span></span></li><li><span><span><span>transport</span></span></span></li><li><span><span><span>    Australia</span></span></span></li></ul>

编辑:Remove line breaks from between html tags 可能是我发现的最接近的正则表达式模式,它仍然不能满足我的需要。

【问题讨论】:

  • 查看了preg_replace ?
  • 可怕的 html,只是说 ;)
  • 是的,Isaac,我尝试了几种不同的模式,但都没有成功(当然是使用 preg_replace)。我知道使用 WYSIWYG 编辑器的问题是糟糕的 HTML :( 我也不想添加另一个像 Tidy 这样的添加。

标签: php regex line-breaks


【解决方案1】:

也许这会有所帮助?它非常、非常基础,而且很容易出错。

$test = '<ul>
<li>
<span><span><span>Manager</span></span></span>
</li>
<li>
<span><span><span>physical</span></span></span>
</li>
<li>
<span><span><span>transport
</span></span></span>
</li>
<li>
<span>
<span><span>    Australia</span></span></span>
</li>
</ul>';

echo preg_replace('/\n?<(.*?)>\n/', '<$1>', str_replace("\r\n", "\n", $test));

编辑:我重新阅读了您的问题,并觉得这不完全是您所追求的。所以,我做了这个:

function strip_tag_nl($tag, $subject) {
    $tag = preg_quote($tag);
    return preg_replace_callback('/(<' . $tag . '(.*?)>)\n?(.*?)(<\/' . $tag . '>)/s', function($matches) {
        $stripped = preg_replace(array('/\n?<(.*?)>\n/'), '<$1>', $matches[3]);
        return $matches[1] . $stripped . $matches[4];
    }, str_replace("\r\n", "\n", $subject));
}

echo strip_tag_nl('li', $test);

将你希望它之间的东西去掉换行符的标签传递给它。例如,strip_tag_nl('ul', $text) 用于您的原始问题...如果您使用strip_tag_nl('li', $text),您将得到:

<ul>
<li><span><span><span>Manager</span></span></span></li>
<li><span><span><span>physical</span></span></span></li>
<li><span><span><span>transport</span></span></span></li>
<li><span><span><span>    Australia</span></span></span></li>
</ul>

【讨论】:

  • 这很好用,感谢您的回复。它完全符合我的要求,即针对特定标签并删除换行符。
  • 嘿,我真的很喜欢你的功能。我怎样才能使其适应缩进?这删除了换行符,我还需要删除标签之间的缩进空格。谢谢!
【解决方案2】:

也许我遗漏了一些东西,但您的示例除了从您的 html 中删除换行符以给出您提供的结果之外没有显示任何其他内容。在这种情况下,一个简单的str_replace(PHP_EOL, '', $string) 可以工作,您不需要任何正则表达式。

我认为这个问题需要澄清一下,除了换行符之外,你究竟想删除什么。

【讨论】:

  • 它会起作用,但我需要与我假设的 preg_replace 结合使用,以便我可以针对特定标签而不是整个内容区域。不过感谢您的建议。
  • 好的,那么也许你应该先访问 Dom 以选择你想要的块然后清理它。 PHP 中有内置的方法,但我个人认为它们并不容易使用。尽管simplehtmldom.sourceforge.net,我最近在 Simple Html DOM 库方面有很好的经验
猜你喜欢
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 2011-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多