我想用regexp解析word-xml文件,我需要用另一个替换下面的代码。
<w:p w:rsidP="001765FC" w:rsidRDefault="00E23FC0" w:rsidR="00EE5514">
<w:sdt>
<w:sdtPr>
<w:rPr>
<w:lang w:val="en-US"/>
</w:rPr>
<w:id w:val="491610033"/>
<w:placeholder>
<w:docPart w:val="A191284B5DB84C2A9DF7CC7D47F0B5AC"/>
</w:placeholder>
<w:temporary/>
<w:showingPlcHdr/>
</w:sdtPr>
<w:sdtEndPr/>
<w:sdtContent>
<w:r w:rsidR="00EE5514" w:rsidRPr="00DC6564">
<w:rPr>
<w:lang w:val="en-US"/>
</w:rPr>
<w:t>[Стоимость]</w:t>
</w:r>
</w:sdtContent>
</w:sdt>
</w:p>
我认为用regexp可以实现,但我无法克服regexp的瓶颈。 我做了一些像:
<w:p(.*)>(\s*((.*)\[Стоимость\](.*))\s*)<\/w:p>
https://regex101.com/r/zN9lD0/4
但这是错误的正则表达式。 我需要找到任何字符串:
<w:p + ANY_TEXT + [TAG_NAME] + ANYTEXT + /w:p>
TAG_NAME在我的例子中是'Стоимость'。
答案 0 :(得分:1)
$pattern = "/<w:p.*?\[(.*?)\].*?<\/w:p>/gs";
答案 1 :(得分:-1)
我强烈建议再次尝试使用XML的正则表达式。如果可能的话,您应该在结构化的基础上操作XML,例如使用DOM表示和getElementsByTagName来查找<w:p>
元素,或者使用XSLT。一个有效的XSLT解决方案(对于手头的任务来说太过分了,但是一旦需求开始变得越来越复杂就应该认真考虑)看起来像这样:
<?php
$doc_string = <<<END
<w:doc xmlns:w="http://example.org/w">
Before
<w:p w:rsidP="001765FC" w:rsidRDefault="00E23FC0" w:rsidR="00EE5514">
<w:sdt>
<w:sdtPr>
<w:rPr>
<w:lang w:val="en-US"/>
</w:rPr>
<w:id w:val="491610033"/>
<w:placeholder>
<w:docPart w:val="A191284B5DB84C2A9DF7CC7D47F0B5AC"/>
</w:placeholder>
<w:temporary/>
<w:showingPlcHdr/>
</w:sdtPr>
<w:sdtEndPr/>
<w:sdtContent>
<w:r w:rsidR="00EE5514" w:rsidRPr="00DC6564">
<w:rPr>
<w:lang w:val="en-US"/>
</w:rPr>
<w:t>[EXAMPLE]</w:t>
</w:r>
</w:sdtContent>
</w:sdt>
</w:p>
After
</w:doc>
END;
$doc = new DOMDocument();
$doc->loadXML($doc_string);
$stylesheet = new DOMDocument();
$stylesheet->loadXML(
"<xsl:stylesheet version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
xmlns:w='http://example.org/w'>
<!-- default: pass everything -->
<xsl:template match='@*|node()'>
<xsl:copy>
<xsl:apply-templates select='@*|node()'/>
</xsl:copy>
</xsl:template>
<!-- special case: replace certain blocks -->
<xsl:template match=\"w:p[//w:t[string(.)='[EXAMPLE]']]\">
<b>Put your replacement here</b>
</xsl:template>
</xsl:stylesheet>"
);
$processor = new XSLTProcessor();
$processor->importStylesheet($stylesheet);
echo $processor->transformToXML($doc);
?>
这不使用任何word-xml特定工具,只是默认情况下由PHP 5提供的标准XML / XSLT库。