如何使用PHP正则表达式删除具有特定内容的XML元素


How to delete XML element with specific contents using PHP regexp?

我需要删除以下XML中带有city Moscow的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>

使用此RegEx:

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

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>
<offer[^>]*>[^<]*<param[^>]*>Moscow<'/param>[^<]*<'/offer>

演示