【发布时间】:2013-01-28 11:53:31
【问题描述】:
我正在通过 XML 创建一个 word 文档,该过程的最后一步是删除所有空白行。当 xml 是多行时,我似乎有一个有效的模式;但是,它是作为单行生成的,这打破了我的 preg_replace。考虑以下 XML:
**<w:p** w:rsidR="009E48E3" w:rsidRPr="008C0DAB" w:rsidRDefault="009E48E3" w:rsidP="004E0AE3"><w:pPr><w:ind w:right="-540"/></w:pPr><w:r w:rsidRPr="008C0DAB">**<w:t>text that should be included</w:t>**</w:r>**</w:p><w:p** w:rsidR="009E48E3" w:rsidRPr="008C0DAB" w:rsidRDefault="009E48E3" w:rsidP="004E0AE3"><w:pPr><w:numPr><w:ilvl w:val="1"/> <w:numId w:val="10"/></w:numPr><w:tabs><w:tab w:val="clear" w:pos="1440"/><w:tab w:val="num" w:pos="1080"/></w:tabs><w:ind w:right="-540" w:hanging="720"/><w:rPr><w:noProof/></w:rPr></w:pPr><w:r><w:rPr><w:noProof/></w:rPr><w:lastRenderedPageBreak/>**<w:t> ; </w:t>**</w:r>**</w:p>**
插入星号只是为了提高可读性
空白行始终位于<w:t></w:t> 标记之间,并包含句点或分号。因此,第一个<w:p> 标记应保留,而第二个应删除。
这是我的模式:<w:p .*<w:t>[ ]+?(\.|;)[ ]+?<\/w:t>.*?<\/w:p>
感谢您的帮助,谢谢!
【问题讨论】:
-
我认为您在第一个
.*之后错过了?。 -
不幸的是我也试过了,没有运气。我很确定我需要让它完全不贪婪,不知道我错过了什么
-
使第一个
.*变得懒惰是行不通的,因为如果第一个<w:t>元素不是空行,.*?将使用该元素和 XML 的其余部分,直到下一个<w:t>元素。这将一直持续到遇到空行<w:t>元素。然后,该模式的其余部分将成功捕获该元素以及该元素的父<w:p>标记的其余部分。结果是当空白行元素被捕获时,所有前面的连续非空白元素也被包含在捕获中。