题
我修改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的意见将搞砸了,太中的标签 - 除非他们碰巧平衡。你可以处理的意见也一样,如果你不介意做正则表达式长一倍,三倍难看。 :)
其他提示