2011-07-16 57 views
1

我需要延長下面的代碼片段的功能,以PRE標記之間的空間轉換-only-字符串中包含HTML:PRE標籤之間有 替換空間

str_replace(' ',' ',$str); 

例如,如果$海峽cotained下面的字符串;

<p>abc 123</p> 
<pre class="abc" id="123">abcedfg 12345</pre> 

將它轉換爲:

<p>abc 123</p> 
<pre class="abc" id="123">abcedfg&nbsp;12345</pre> 

類似;

<p>abc 123</p> 
<pre>abcedfg 12345</pre> 

將被轉換爲:

<p>abc 123</p> 
<pre>abcedfg&nbsp;12345</pre> 

回答

1
$text = '<pre>test 1234 123</pre>'; 
$text2 = '<pre class="test">test 1234 123</pre>'; 

function testreplace($text) { 
    return preg_replace_callback('/[\<]pre(.*)[\>](.*)[\<]\/pre[\>]/i', 
     create_function(
      '$matches', 
      'return "<pre".$matches[1].">".str_replace(" ", "&nbsp;", $matches[2])."</pre>\n";' 
     ), $text); 
} 

echo testreplace($text); 
echo testreplace($text2); 

我花了一段時間...但它的工作原理。

+0

現在就給它破解,謝謝 – Graham

+0

一目瞭然,上面的代碼將空格改爲 ? – Graham

+1

@henasraf:請粘貼您的代碼而不用轉義html特殊字符。然後選擇您的代碼並在編輯器中使用代碼格式按鈕「{}」。 –

2

您可以使用DOM解析器。這裏是你將如何使用PHP原生DOM功能做到這一點:

<?php 
$test = ' 
<p>abc 123</p> 
<pre class="abc" id="pre123">abcedfg 12345</pre> 
<p>abc 123</p> 
<pre class="abc" id="pre456">abcedfg 12345</pre> 
<div> 
    <div> 
     <div> 
      <pre class="abc" id="pre789">abcedfg 12345</pre> 
     </div> 
    </div> 
</div> 
'; 
$dom = new DOMDocument("1.0"); 
$dom->loadHTML($test); 
$xpath = new DOMXpath($dom); 
$pre = $xpath->query("//pre"); 
foreach($pre as $e) { 
    $e->nodeValue = str_replace(" ", "&nbsp;", $e->nodeValue); 
} 
echo $dom->saveHTML(); 

輸出

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body><p>abc 123</p> 
<pre class="abc" id="pre123">abcedfg&nbsp;12345</pre> 
<p>abc 123</p> 
<pre class="abc" id="pre456">abcedfg&nbsp;12345</pre> 
<div> 
    <div> 
     <div> 
      <pre class="abc" id="pre789">abcedfg&nbsp;12345</pre> 
     </div> 
    </div> 
</div></body></html> 

編輯:

我不知道如何擺脫DOCTYPE/HTML/BODY標籤。在PHP> = 5.3.6上工作的一種可能的解決方案是指定在saveHTML()方法中輸出哪個節點。其他可能性是使用正則表達式,我首先避免了。

+0

謝謝薩爾曼。我會根據你的回答重構我的問題。 – Graham

+0

右鍵,我提出了一個新問題http://stackoverflow.com/questions/6716486/convert-spaces-between-pre-tags-via-dom-parser 請隨時繼續在那裏的DOM解析器的解決方案,我我不知道如何去除doctype/html/body標籤..我確實有PHP> = 5.3.6 – Graham

+0

它比眼睛上的RegEx更「清潔」,但除此之外似乎沒有必要開始將DOM與一個混淆相對簡單的行動 – casraf