我修改Kohana的库时,文本:: auto_p()的核心功能功能

该函数描述本身作为“类固醇nl2br()”。本质上,它提供了<br />单个换行,但双换行符与<p>标签包围。

我与它发现的限制是,它会,但在一个<br />元件<pre>s。这将创建一个新的双行,这不是我想要的。我已经做了修改拿起与正则表达式预先元件,并且一个回调将去掉其中工程好吗的<br />

然而,主要的问题是,我有我的文字代码样本被auto_p()'d,我需要保留缩进(为便于阅读)。不幸的是对我来说,函数带前缘和上线尾部的空白。

下面是去掉前导间隔正则表达式

$str = preg_replace('~^[ \t]+~m', '', $str);

我不是最好的正则表达式的大师,但我敢肯定,说:“获取前导空格和制表符,其中至少有一个为空字符串替换它们。”

我曾尝试删除这条线,但随后会增加<br />,我绝对不希望他们 - 在一种情况下,我得到这样的输出

<ul><br />
    <li>something</li>
</ul>

如何将修改此正则表达式或代码,以不剥离导致一个<pre>元件的内部空间?

从Kohana的原始辅助功能可用此处。 (滚动到几乎底部)。

我知道我会得到一些“使用HTML解析器”式的答案 - 而你可能是正确的 - 现有的代码只是使用正则表达式,我宁愿一个简单的解决方案(在这里我没有包括库等)。

感谢您的时间。

有帮助吗?

解决方案

下面是我会怎么做:

$str = preg_replace(
    '~^[ \t]++(?=(?:[^<]++|<(?!/?+pre\b))*+(?:\z|<pre\b))~im',
    '', $str);

匹配一些线前导空白后,将先行扫描提前为<pre></pre>标签。先行的肉是该位:

(?:[^<]++|<(?!/?+pre\b))*+

它匹配的零个或更多的东西,这不是一个左尖括号,左尖括号,如果它不是一个<pre></pre>标签的开头。该部分将仅停止匹配时,它遇到<pre>(起始)标签,</pre>(结束)标记,或输入的结束。如果它是停止它的结束标记,你知道你是一个<PRE>元素里面,所以你不想做更换。

在所有格量词('++''*+',和'?+')是必不可少的,以防止灾难性回溯。 (我不能帮助它:这句话总让我想到的共振级联方案的的距离的半衰期。)

此技术还假设合理地形成的HTML,即,所有<pre>...</pre>标签适当地平衡。 SGML的意见将搞砸了,太中的标签 - 除非他们碰巧平衡。你可以处理的意见也一样,如果你不介意做正则表达式长一倍,三倍难看。 :)

其他提示

很多我猜

您的问题进行了讨论 - 看看这个链接

http://us3.php.net/manual/en /function.nl2br.php#91828

这一个,以及:

http://us3.php.net/manual/en /function.nl2br.php#39641

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top