0

我有一个这样的字符串:

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

而字符串包含:

page-category-128

有什么帮助吗?

4

3 回答 3

3

Here is a non-regex way using explode and 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));

Output:

Array
(
    [0] => page-9000
    [6] => rss-latest
)
于 2019-09-13T08:15:21.563 回答
3

尝试使用以下模式:

(?<=,|^)(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
)
于 2019-09-13T08:00:42.123 回答
1

(?<=\,)(?=,) 要求在匹配模式的,两边都存在。您还想在字符串的开头/结尾进行匹配,这就是您需要明确告诉匹配,字符串的开头/结尾或使用双重否定逻辑与否定外观内的否定字符类的地方。

您可以使用

(?<![^,])(?:rss-latest|listing-latest-no-category|category-128|page-9000)(?![^,])

查看正则表达式演示

在这里,(?<![^,])匹配字符串位置或 a 的开头,(?![^,])匹配字符串位置或的结尾,

现在,您甚至不需要捕获组,您可以使用非捕获来消除它的开销,(?:...). preg_match_all不必为子匹配分配内存,结果数组会更干净。

PHP 演示

$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 )
于 2019-09-13T08:01:46.217 回答