PHP正则表达式解析单词xml

时间:2015-04-14 22:24:29

标签: php regex

我想用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在我的例子中是'Стоимость'。

2 个答案:

答案 0 :(得分:1)

$pattern = "/<w:p.*?\[(.*?)\].*?<\/w:p>/gs";

DEMO https://regex101.com/r/zN9lD0/6

答案 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库。