2015-04-14 2 views
0

Я хочу проанализировать word-xml-файл с регулярным выражением, и мне нужно заменить следующий код на другой.PHP regexp для разбора слова 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. Я сделал somethins как:

<w:p(.*)>(\s*((.*)\[Стоимость\](.*))\s*)<\/w:p> 

https://regex101.com/r/zN9lD0/4

Но это неправильно регулярное выражение. мне нужно найти строку:

<w:p + ANY_TEXT + [TAG_NAME] + ANYTEXT + /w:p> 

TAG_NAME является «Стоимость» в моем примере.

ответ

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

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

+0

Благодаря миллиона – user2455668

+0

Update: https://regex101.com/r/zN9lD0/8 Необходимое отрицательное опережения, для разделения тегов: user2455668

-1

Я настоятельно рекомендую Agains пытаются использовать регулярные выражения для 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); 
?> 

Это не использует слово XML конкретных инструментов, просто стандартные библиотеки XML/XSLT, предоставленные PHP 5 по умолчанию.

+0

я искал какой-либо инструмент для proccess слово-XML, но не нашел работы. так как мне нужно искать и заменять только один тип выражения, я думаю, нормально использовать регулярное выражение. – user2455668

+0

downvoter: рассмотрите вопрос о возврате вашего downvote в качестве рабочего примера. –