我正在尝试匹配以下字符串中的 .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.xml
和 2020-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 并匹配水平空白字符
}
按字面意思匹配
如果您想要组 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 - 如何仅通过正则表达式查找 .xml 链接和日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57111279/