php - 如何仅通过正则表达式查找 .xml 链接和日期

标签 php regex

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

| 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 }

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

/\}\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

最佳答案

您使用的模式匹配从第一个结束 } 到 .xml 后的结束 }

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

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

说明

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

Regex demo | Php demo

如果您想要组 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} 匹配水平空白字符和 }

Regex demo | Php demo

关于php - 如何仅通过正则表达式查找 .xml 链接和日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57111279/

相关文章:

python - 如何用正则表达式匹配多行

python - 使用正则表达式查找包含特定表达式的句子

javascript - jQuery:通过 ajax 将附加数组添加到序列化表单数据并使用 PHP 访问它?

javascript - Canvas 的 ToDataURL (JavaScript) 在通过 PHP 上传到服务器后创建损坏的 PNG 文件

php - Laravel - 在一个方法中返回多个值

python - 将 unicode 表示与符号进行比较

javascript - 如何在 php 代码中的 javascript 代码中使用 php 变量?

php - 当输入包含超过 1 个项目的数组时,foreach 循环中的 MySQL 查询不返回结果

regex - powershell中将字符串解析成hash最简洁的方法

javascript - html 表单 : email not validating against pattern