如何使用PHP regexp删除具有特定内容的XML元素?

时间:2016-03-23 12:42:01

标签: php regex

我需要在以下XML中删除城市莫斯科的offer元素:

<offer id="14305" available="true">
<param name="City">Moscow</param>
</offer>
<offer id="14306" available="true">
<param name="City">LA</param>
</offer>

如何使用PHP正则表达式进行操作?

我试过了:

preg_replace('/<offer[^(>Moscow<).]+?<\/offer>/s', ''. $string);

但没有成功。

我读了你的意见。真的很棒。但是我有一个贪婪的新问题:

<offer id="14305" available="true">
<param name="Color">Red</param>
<engine>XYZ</engine>
<param name="City">Moscow</param>
</offer>
<offer id="14306" available="true">
<param name="Color">Red</param>
<param name="City">LA</param>
</offer>
<offer id="14306" available="true">
<weight>1000</weight>
<param name="Color">Red</param>
<param name="City">LA</param>
</offer>

我的正则表达式过于贪婪:(

<offer.*?>\s*?<param.*?>\s*?Moscow\s*?<\/param>\s*?<\/offer>

2 个答案:

答案 0 :(得分:2)

使用此RegEx:

<offer.*?>\s*?<param.*?>\s*?Moscow\s*?<\/param>\s*?<\/offer>

Live Demo on Regexr

工作原理:

<offer.*?>    # Select opening <offer> with optional parameters
\s*?          # Optional Whitespace
<param.*?>    # Select opening <param> with options parameters
\s*?          # Optional Whitespace
Moscow        # Select Moscow text
\s*?          # Optional Whitespace
<\/param>     # Select closing </param>
\s*?          # Optional Whitespace
<\/offer>     # Select closing </offer>

答案 1 :(得分:0)

<offer[^>]*>[^<]*<param[^>]*>Moscow<\/param>[^<]*<\/offer>

DEMO