我明白了,因爲正則表達式本質上是無狀態的,要實現複雜的匹配而不訴諸補充應用邏輯是相當困難的,但是我很想知道下面是否可能。正則表達式匹配空白,但跳過部分
匹配所有的空白,很容易:\s+
但跳過某些分隔符之間的空白,在我的情況
字<pre>
和
</pre>
nostrip
。
是否有任何技巧可以實現這個目標?我正在考慮沿着兩個單獨的比賽,一個爲所有空白,一個爲
nostrip部分,並以某種方式否定後者從前者。<pre>
塊
"This is some text NOSTRIP this is more text NOSTRIP some more text."
// becomes
"ThisissometextNOSTRIP this is more text NOSTRIPsomemoretext."
給出
標籤
NOSTRIP部分是無關緊要的,我不會試圖解析
的嵌套樹
HTML或任何,只是整理一個文本文件,但節省了
nostrip部分中的空格,原因很明顯。<pre>
blocks
(更好?)
這是最終我跟去了。我相信它可以在幾個地方進行優化,但現在它可以很好地工作。
public function stripWhitespace($html, Array $skipTags = array('pre')){
foreach($skipTags as &$tag){
$tag = "<{$tag}.*?/{$tag}>";
}
$skipped = array();
$buffer = preg_replace_callback('#(?<tag>' . implode('|', $skipTags) . ')#si',
function($match) use(&$skipped){
$skipped[] = $match['tag'];
return "\x1D" . (count($skipped) - 1) . "\x1D";
}, $html
);
$buffer = preg_replace('#\s+#si', ' ', $buffer);
$buffer = preg_replace('#(?:(?<=>)\s|\s(?=<))#si', '', $buffer);
for($i = count($skipped) - 1; $i >= 0; $i--){
$buffer = str_replace("\x1D{$i}\x1D", $skipped[$i], $buffer);
}
return $buffer;
}
你在html上使用正則表達式嗎?爲什麼? – 2011-05-12 20:51:51
實際上,你需要的更加複雜:正則表達式還需要確保在
,反之亦然。 – abesto 2011-05-12 20:54:30http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – mellamokb 2011-05-12 21:02:22