我有一个像这样的字符串:
<distributionManagement>
<snapshotRepository>
<id>snapshots</id>
<name>libs-snapshot</name>
<url>http://artifactory.private-apps.com/artifactory/libs-snapshot-local</url>
</snapshotRepository>
</distributionManagement>
我制作了此正则表达式,希望通过以下方式获得整个标签:
page-9000,page-template,page-type,page-category-128,image-195,listing-latest,rss-latest,even-more-info,even-more-tags
我希望它与所有匹配项匹配。
在这种情况下:
(?<=\,)(rss-latest|listing-latest-no-category|category-128|page-9000)(?=\,)
此正则表达式可以很好地检查逗号之间的整个单词,但是它忽略了第一个和最后一个,因为它不在逗号之间(很明显)。
我还尝试过检查它是在逗号之间还是在开头逗号之间,还是在结尾逗号之间,但是它会给我带来误报,因为它会匹配:
page-9000 and rss-latest.
字符串包含:
category-128
有帮助吗?
答案 0 :(得分:3)
这是使用explode
和array_intersect
的非正则表达式:
$arr1 = explode(',', 'page-9000,page-template,page-type,page-category-128,image-195,listing-latest,rss-latest,even-more-info,even-more-tags');
$arr2 = explode('|', 'rss-latest|listing-latest-no-category|category-128|page-9000');
print_r(array_intersect($arr1, $arr2));
输出:
Array
(
[0] => page-9000
[6] => rss-latest
)
答案 1 :(得分:2)
尝试使用以下模式:
(?<=,|^)(rss-latest|listing-latest-no-category|category-128|page-9000)(?=,|$)
我所做的唯一更改是将边界标记^
和$
添加到环视环境中,以使其也与输入的开始和结束相匹配。
脚本:
$input = "page-9000,page-template,page-type,page-category-128,image-195,listing-latest,rss-latest,even-more-info,even-more-tags";
preg_match_all("/(?<=,|^)(rss-latest|listing-latest-no-category|category-128|page-9000)(?=,|$)/", $input, $matches);
print_r($matches[1]);
此打印:
Array
(
[0] => page-9000
[1] => rss-latest
)
答案 2 :(得分:1)
(?<=\,)
和(?=,)
需要在匹配模式的两侧都存在,
。您还想在字符串的开头/结尾进行匹配,这是您需要明确告诉匹配,
或字符串的开头/结尾的地方,或者在负向环视内使用带负数字符类的双负逻辑
您可以使用
(?<![^,])(?:rss-latest|listing-latest-no-category|category-128|page-9000)(?![^,])
请参见regex demo
在这里,(?<![^,])
匹配字符串位置的开头或,
,而(?![^,])
匹配字符串位置的结尾或,
。
现在,您甚至不需要捕获组,您可以使用non-capturing group,(?:...)
摆脱它的开销。 preg_match_all
不必为子匹配分配内存,结果数组将更加整洁。
$re = '/(?<![^,])(?:rss-latest|listing-latest-no-category|category-128|page-9000)(?![^,])/m';
$str = 'page-9000,page-template,page-type,page-category-128,image-195,listing-latest,rss-latest,even-more-info,even-more-tags';
if (preg_match_all($re, $str, $matches)) {
print_r($matches[0]);
}
// => Array ( [0] => page-9000 [1] => rss-latest )