猿问

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

我有一个这样的字符串:

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

有什么帮助吗?


SMILET
浏览 636回答 3
3回答

RISEBY

尝试使用以下模式:(?<=,|^)(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(&nbsp; &nbsp; [0] => page-9000&nbsp; &nbsp; [1] => rss-latest)

慕哥9229398

这是使用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(&nbsp; &nbsp; [0] => page-9000&nbsp; &nbsp; [6] => rss-latest)

一只名叫tom的猫

的(?<=\,)和(?=,) 所需要的存在的,对匹配图案的两侧。您还想在字符串的开头/结尾进行匹配,这就是您需要明确告诉匹配,字符串的开头/结尾或使用双重否定逻辑与否定外观内的否定字符类的地方。您可以使用(?<![^,])(?: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)) {&nbsp; print_r($matches[0]);}// => Array ( [0] => page-9000 [1] => rss-latest )
随时随地看视频慕课网APP
我要回答