1

我追求一种在标签之间进行选择时始终将所有内容放在一条线上的模式。在这种情况下,我希望<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>

编辑:从 html 标记之间删除换行符可能是我发现的最接近的正则表达式模式,它仍然不能满足我的需要。

4

2 回答 2

3

也许这会有所帮助?这是非常非常基本的,可能容易出错。

$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>
于 2013-05-27T01:40:51.527 回答
1

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

我认为这个问题需要澄清除了换行符之外你想要删除的内容。

于 2013-05-27T02:17:18.187 回答