2010-11-10 48 views
2

我試着去XML轉換爲HTML,將XML IM這裏部分試圖解析
<entry morerows="1">data 1</entry>
<entry morerows="2">data 2</entry>
<entry morerows="3">data 3</entry>
<entry morerows="4">data 4</entry>數學與了preg_replace捕捉

這應該變成
<td rowspan="2">data 1</td>
<td rowspan="3">data 2</td>
<td rowspan="4">data 3</td>
<td rowspan="5">data 4</td>

心中已經嘗試下面的代碼,但沒有成功:
$content = preg_replace('/<entry morerows="([\d]+?)">/', '<tr '.('$1' + 1).'>' ,$content);

林無法與捕獲組來計算的,所以我的問題是我怎麼能捕獲「morerows」屬性值,並添加1〜該值並用此替換當前值。 <entry>標籤的數量可以在1到255之間。

+0

爲什麼不使用PHP中的SimpleXML解析XML?然後,您可以毫不費力地循環播放條目。 – Treffynnon 2010-11-10 11:17:15

回答

4

除了/ e修飾符,您還必須將替換部分重寫爲真正的表達式。

preg_replace('/<entry morerows="([\d]+?)">/e', 
       ' "<tr rowspan=" . ("$1" + 1) . ">" ', 

注意單引號將整個表達式。在雙引號內使用(爲了可讀性)來構造另一個字符串。無關的空格在PHP上下文中,只有雙引號內的字符串變成結果數據。

+0

這工作就像一個魅力,非常感謝:) – Thul 2010-11-10 12:12:48

1

您必須使用/ e修飾符來實現此目的(請參閱this codepad example - 注意使用htmlentities()使視覺顯示更加明顯)。然而,在這裏查看你的代碼,你的問題似乎不太可能實際做到你想要的 - <td rowspan="2">data 1</td>然後<td rowspan="3">data 2</td>不可能做任何非常有吸引力的事情 - 你通常想要跳過後續行中的rowspanning列。我建議考慮一下XSL,這將爲您提供更靈活的語言來執行這種標記匹配和重寫 - 請參閱PHP's XSL documentation瞭解更多信息。

0

您需要對preg_replace中的模式賦予'e'修飾符,以便將代碼放入替換文本中而不是文本中。