数学与preg_replace捕获

时间:2010-11-10 11:10:49

标签: php regex

我试图将XML转换为HTML,这是我试图解析的XML的一部分
<entry morerows="1">data 1</entry>
<entry morerows="2">data 2</entry>
<entry morerows="3">data 3</entry>
<entry morerows="4">data 4</entry>

这应该变成了
<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之间。

3 个答案:

答案 0 :(得分:4)

除了/ e修饰符,您还必须将替换部分重写为真实表达式。

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

请注意,单引号括起整个表达式。在双引号内使用(为了便于阅读)来构造另一个字符串。无关的空格在PHP上下文中,只有双引号内的字符串才会成为结果数据。

答案 1 :(得分:1)

您必须使用/ e修饰符来完成此操作(请参阅this codepad example - 请注意使用htmlentities()使视觉显示更加明显)。但是,在这里查看您的代码,您的问题似乎不太可能实际执行您想要的操作 - <td rowspan="2">data 1</td>后跟<td rowspan="3">data 2</td>不太可能做任何非常有吸引力的事情 - 您通常会想跳过后续行中的rowspanning列。我建议改为研究XSL,这将为您提供更灵活的语言来执行这种标记匹配和重写 - 请参阅PHP's XSL documentation了解更多信息。

答案 2 :(得分:0)

你需要在preg_replace中为模式赋予'e'修饰符,以便将代码放在替换而不是文本中。