我正在使用一种模式,当在标签之间进行选择时,该模式将始终将所有内容放在一行上。在这种情况下,我希望<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可能是我发现的最接近的正则表达式模式,它仍然不能满足我的需要。
答案 0 :(得分:2)
也许这会有所帮助?它非常非常基本,可能容易出错。
$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>
答案 1 :(得分:0)
也许我错过了一些东西,但是你的示例除了从你的html中删除换行符以显示你提供的结果外,没有显示任何其他内容。在这种情况下,一个简单的str_replace(PHP_EOL, '', $string)
可以工作,你不需要任何正则表达式。
我认为这个问题需要澄清除了换行符之外你想要删除的内容。