2012-03-09 104 views
1

這是我第一次發佈到stackoverflow,但我以前使用過這個令人驚歎的網站。用於PHP的RegEx替換某個HTML標記與另一個字符串之間的某個字符

無論如何,我吸取正則表達式,但我認爲我需要他們爲我需要做的。

簡短的問題: 我需要'&nbsp;'更換的<code></code>任何發生之間的空間' '

更多細節:

這背後的動機是因爲我的代碼切片創建額外的線路,因爲多餘的空格(我asuming)的每個其他線路。通過用&nbsp;替換空格,我能夠正確地格式化代碼。

但是,這引入了很多額外的字符到我的HTML。它不僅效率低下,而且還使word-wrap: break-word;將單詞分解成一半,而不是將整個單詞向下移動。

+0

您可以使用您的代碼通過使用語法的問題。您還可以轉義特定字符,以便它們出現在您的問題中。轉義字符是'\\'。 – hakre 2012-03-09 00:55:13

回答

0

免責聲明:我認爲這絕對不是您需要的解決方案,其他一些答案已經解決了您應該/可能會做什麼來完成您的任務。

但讓我們假設你想用正則表達式來做這件事。因爲我認爲我們可以作一個假設,與<code>stuff</code>,東西不會包含嵌套代碼標籤,你可以用它來完成你的短期問題,但你仍然需要幾個步驟:

//sorry for the c#, the but intent should translate clearly. 
string input = @"<div>whatever</div> id='tricky'><code>adsfasd fasdfasdfvar data = "" 8 5.00000000 8.0 9.000000"";var re = /(\.0{0,2})(0*)/g; var match = re.exec(data);alert(data.replace(re, RegExp.1));</code><p>more stuff with stuff.</p>"; 
var code = Regex.Match(input, "<code>(.*?)</code>").Value; 
var munged = Regex.Replace(code, @"\s", "&nbsp;"); 
var result = Regex.Replace(input, "<code>(.*?)</code>", munged); 
+0

在PHP中,'preg_replace_callback'可以讓你將第一次和最後一次調用結合到'正則表達式' – 2012-03-09 02:05:13

+0

我盡力讓正則表達式工作,但我不知道我在做什麼(在這裏插入科學狗模因)。我需要PHP版本的幫助,但不需要HTML代碼標籤,我需要找到BBCode代碼標籤[code]和[/ code],並獲取這些標籤之間的文本,以便我可以替換空格。 – 2012-03-09 20:31:05

+0

我最終得到了別人的幫助[鏈接] http://stackoverflow.com/questions/9640670/php-regex-get-text-between-bbcode-tags [/ link] – 2012-03-09 22:12:15

1

首先,不是正則表達式,而是DOM。在PHP中,這將是:

foreach(DOMDocument::loadHTML($source)->getElementsByTagName('code') as $code) { 
    foreach($code->childNodes as $node) { 
     // assumes no elements, otherwise check nodeType == 3 
     // and recurse into elements 
     $node->textContent = str_replace(" ","\xC2\xA0", $node->textContent); 
    } 
} 

你可以(在DOM需要)用實際空格字符,而不是實體表示它。

然而,這些多餘的線條,可以更好地與控制:

code {white-space: nowrap;} 

white-space: pre/white-space: pre-line

CSS解決方案具有複製&可粘貼性的優點。否則& nbsp-filled示例會給出「WTF !?」解析錯誤。

另外,還要確保您的CMS /標記轉換器(如果你使用一個)不插入<br>自動將在<pre>/white-space:pre元素雙線。

+0

那麼,你如何插入' '與DOMDocument的部分實際上是缺少;) – hakre 2012-03-09 00:57:46

+0

好,現在它是明確的。 – Kornel 2012-03-09 01:02:13

+0

DOMDocument使用UTF-8編碼。'「\ xa0」'是UTF-8的無效字符 - >'utf8「\ xA0」不映射到Unicode'。保重。 – hakre 2012-03-09 01:08:26

1

與CSS,而不是做它:

code {white-space: nowrap;} /* or */ code {white-space: pre;} 

white-space CSS property­Docs

+0

我嘗試了所有的不同的空白空間的CSS,他們都沒有正確工作。我不確定發生了什麼事。 – 2012-03-09 16:33:31

+0

您可能需要將'code'轉換爲block-mode:'code {display:block;}'或使用它的父元素。參見['code' HTML Element](https://developer.mozilla.org/en/HTML/Element/code)。 – hakre 2012-03-10 10:06:40

相關問題