用正则表达式匹配逗号之间的整个单词,或者以逗号开头或以逗号结尾

时间:2019-09-13 07:55:06

标签: php regex

我有一个像这样的字符串:

    <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

有帮助吗?

3 个答案:

答案 0 :(得分:3)

这是使用explodearray_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不必为子匹配分配内存,结果数组将更加整洁。

PHP demo

$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 )