3 回答

TA贡献1856条经验 获得超5个赞
尝试使用以下模式:
(?<=,|^)(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
)

TA贡献1877条经验 获得超6个赞
这是使用explodeand的非正则表达式方式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
)

TA贡献1906条经验 获得超3个赞
的(?<=\,)和(?=,) 所需要的存在的,对匹配图案的两侧。您还想在字符串的开头/结尾进行匹配,这就是您需要明确告诉匹配,字符串的开头/结尾或使用双重否定逻辑与否定外观内的否定字符类的地方。
您可以使用
(?<![^,])(?: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 )
- 3 回答
- 0 关注
- 635 浏览
添加回答
举报