【问题标题】:regex matching an open and close tag and a certain text patterns inside that tag [duplicate]正则表达式匹配打开和关闭标签以及该标签内的某些文本模式[重复]
【发布时间】:2011-09-16 04:00:35
【问题描述】:

这是我从 sitemap.xml 获得的示例自定义标签

<url>
  <loc>http://sitename.com/programming/php/?C=D;O=A</loc>
  <changefreq>weekly</changefreq>
  <priority>0.64</priority>
</url>

有很多这样的条目,如果你看到 loc 标签,它的末尾有 c=d;0=a。 我想删除所有以 &lt;url&gt; 开头并以 &lt;/url&gt; 结尾的条目,其中包含 C=D;0=A 或类似的模式。

下面的表达式匹配了整个上面指定的标签

<url>(.|\r\n)*?<\/url>

但我想像上面声明中指定的那样匹配。

我们如何形成正则表达式来匹配这些条件(模式)?

【问题讨论】:

  • @Fredrik,答案不正确。正则表达式可用于解析 xml,但这不是最好的方法。
  • @Fredrik:在这里使用正则表达式没有问题。 OP 不是试图解析 XML,而是它的一个非常具体的子集,看起来像他的帖子中的示例。
  • 我没有解析 xml,但我需要使用 Dreamweaver 之类的文本编辑器删除站点地图中的这些条目。这样我就可以拥有一个更干净的站点地图,因为我没有在我的站点中包含许多子文件夹的文件夹之一中添加 index.html。我正在制作站点地图vikku.info/programming

标签: xml regex


【解决方案1】:

对 XML 使用正则表达式不是一个好主意。根据您应该使用一些 XML 阅读器的语言,提取 &lt;url&gt; 节点,然后使用正则表达式匹配节点的内容。 许多 XML 库都支持的一种用于查询 XML 数据的有用语言是XPath

【讨论】:

  • 我没有使用正则表达式来解析 xml,但它只是我的站点地图,其中包含所有这些条目,因为我在具有许多子文件夹的重要文件夹中没有默认 index.htm 脚本。我想在没有那些额外的 c=d 项目的情况下更新我的站点地图,所以我需要一个正则表达式来删除所有这些条目并保持站点地图的清洁。所以我不能编写一个程序来删除不需要的条目,而是我只需要一个正则表达式来即时删除它并想要更新我的站点地图。
  • 有时这些库是多余的。例如,处理包含有限的类似 html 的标签的 wiki 文本。 @morja 的回答实际上回答了这个问题……
【解决方案2】:

如果你绝对必须使用正则表达式,这个:

<([a-z][a-z0-9]*)\b[^>]*>(.*?)(C=D;O=A){1}(.*?)</\1>

会给你电话:

http://sitename.com/programming/php/?C=D;O=A

然后我会遍历父标签并用它做任何我想做的事情。

【讨论】:

  • 它只匹配一行而不是完整的 url 打开和关闭标签。
【解决方案3】:

试试这个:

/<url>(?:(?!<\/url>).)*C=D;O=A.*?<\/url>/m

否定前瞻保证您不匹配多个节点。

请看这里:rubular

【讨论】:

  • 我忘了说我正在使用dreamweaver 来删除。无论如何,让我们尝试一下,并会在这里更新。
  • 好的,dreamweaver 可能不支持环视...但试一试。
  • 对于dreamweaver,它不起作用。希望它能在 php 中工作...?
  • 是的,它在 php 中工作。但是您需要使用s 标志而不是m
  • 如果我们没有节点名称怎么办。我只想要一个正则表达式来验证像 test 这样的 xml 节点
猜你喜欢
  • 1970-01-01
  • 2012-07-20
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多