2

我正在尝试从以下字符串匹配 .xml 链接和过期日期。

| iptv: { 1 } { 8000 } { localhost.test/categories/music.xml } { 金 } { 000000 } { 01 02 03 04 05 06 07 08 09 10 11 12 13 14 } { 1 } | 味精:{1}{0}{欢迎过期:2020-01-20}{0}{0}{00}{0}

我尝试了以下规则来匹配它

/\}\s+\{\s+[^>]*xml\s+\}/igm

老实说,我不懂正则表达式,我的尝试可能完全没用。

我的 PHP 代码

$str = '| iptv: { 1 } { 8000 } { localhost.test/categories/music.xml } { golden } { 000000 } { 01 02 03 04 05 06 07 08 09 10 11 12 13 14 } { 1 } | msg: { 1 } { 0 } { Welcome expire: 2020-01-20 } { 0 } { 0 } { 00 } { 0 }';
$rule = '/\}\s+\{\s+[^>]*xml\s+\}/igm';
preg_match_all('', $str, $matches);

我的愿望输出

localhost.test/categories/music.xml2020-01-20

4

1 回答 1

2

您使用的模式匹配从第一次关闭}}.xml 之后的关闭

您可以使用交替和捕获组来匹配其中任何一个。对于日期,您可以使用类似日期的模式。请注意,它不会验证日期本身。

{[^[{}]*\h(\S+\.xml|\d{4}-\d{2}-\d{2})\h}

解释

  • {从字面上匹配
  • [^[{}]*\h否定字符类,匹配 0+ 次 not {or },然后是水平空白字符
  • (捕获组 1
    • \S+\.xml匹配 1+ 次非空白字符.和 xml
    • |或者
    • \d{4}-\d{2}-\d{2}使用数字和类似日期的模式匹配-
    • )\h关闭第 1 组并匹配一个水平空白字符
  • }从字面上匹配

正则表达式演示| php演示

如果您想要第 1 组和第 2 组,您可以使用:

{\h(\S+\.xml)\h}.*?{\h[^:]+:\h(\d{4}-\d{2}-\d{2})\h}

解释

  • {\h匹配{和水平空白字符
  • (捕获组 1
    • \S+\.xml匹配 1+ 次非空白字符.和 xml
  • )关闭组 1
    • \h}匹配水平空白字符和}
  • .*?{匹配除换行符以外的任何字符 0+ 次非贪婪并匹配{
  • \h[^:]+:\h匹配 1 次以上不是 :,然后匹配 :
  • (捕获组 2
    • \d{4}-\d{2}-\d{2}匹配类似日期的模式
  • )关闭组 2
  • \h}匹配水平空白字符和}

正则表达式演示| php演示

于 2019-07-19T11:34:08.800 回答