这两种方法都将指定的缓冲区设置为一个值(而不是null或undefined)我建议使用第一种方法。
1. 以任意顺序查找以下内容:
/^(?=.*\bstart=(?P<publishDate>.*?);|(?P<publishDate>))(?=.*\bend=(?P<expirationDate>.*?);|(?P<expirationDate>))/ix
/^(?= # from beginning, look ahead for start
.*\b # any character 0 or more times (backtrack to match 'start')
start=(?P<publishDate>.*?)
| (?P<publishDate>) # OR, put empty string publish
)
(?= # from beginning, look ahead for end
.*\b # same criteria as above ...
end=(?P<expirationDate>.*?)
| (?P<expirationDate>)
)
/ix
2. 查找以开始/结束顺序的任一/两个内容:
/^(?:.*\bstart=(?P<publishDate>.*?);|(?P<publishDate>))(?:.*\bend=(?P<expirationDate>.*?);|(?P<expirationDate>))/ix
编辑 -
@Josh Davis - 我不得不去PCRE.org搜索,那里有很棒的东西。
使用Perl没有重复名称的问题。
文档:“如果多个组具有相同的名称,则它引用当前匹配中最左侧定义的组。”
在交替使用时永远不会出现问题。
对于PCRE ..
如果与分支重置一起使用,则重复名称将在PHP中正常工作。
分支重置确保重复名称将占用相同的捕获组。
之后,使用dup名称常量,$match ['name']将包含一个值
或空字符串,但它将存在。
例如:
(?J) = PCRE_DUPNAMES
(?| ... | ...) = 分支重置
这个有效:
/(?Ji)^
(?= (?| .* end = (?P<expirationDate> .*? ); | (?P<expirationDate>)) )
(?= (?| .* start = (?P<publishDate> .*? ); | (?P<publishDate>)) )
/x
在这里尝试:http://www.ideone.com/zYd24
<?php
$string = "start=2011-03-(start)10T13:00:00Z;end=2011-03-(end)30T13:00:00Z;scheme=W3C-DTF";
preg_match('/(?Ji)^
(?= (?| .* end = (?P<expirationDate> .*? ); | (?P<expirationDate>)) )
(?= (?| .* start = (?P<publishDate> .*? ); | (?P<publishDate>)) )
/x', $string, $matches);
echo "Published = ",$matches['publishDate'],"\n";
echo "Expires = ",$matches['expirationDate'],"\n";
print_r($matches);
?>
输出
Published = 2011-03-(start)10T13:00:00Z
Expires = 2011-03-(end)30T13:00:00Z
Array
(
[0] =>
[expirationDate] => 2011-03-(end)30T13:00:00Z
[1] => 2011-03-(end)30T13:00:00Z
[publishDate] => 2011-03-(start)10T13:00:00Z
[2] => 2011-03-(start)10T13:00:00Z
)