【问题标题】:Matching whole words between commas, or a comma at the beginning, or a comma at the end with Regex用正则表达式匹配逗号之间的整个单词,或开头的逗号,或结尾的逗号
【发布时间】:2019-09-13 07:55:06
【问题描述】:

我有一个这样的字符串:

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

有什么帮助吗?

【问题讨论】:

  • listing-latest-no-category 似乎没有出现在您的输入字符串中。
  • 为什么不直接使用explode(',', $variable),然后在数组中查找你想要的单词?

标签: php regex


【解决方案1】:

尝试使用以下模式:

(?<=,|^)(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】:

    这是使用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
    )
    

    【讨论】:

      【解决方案3】:

      (?&lt;=\,)(?=,) 需要在匹配模式的两侧存在 ,。您还想在字符串的开头/结尾进行匹配,这是您需要明确告诉匹配, 或字符串的开头/结尾,或者在否定环顾内使用带有否定字符类的双重否定逻辑。

      你可以使用

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

      regex demo

      这里,(?&lt;![^,]) 匹配字符串位置的开头或,(?![^,]) 匹配字符串位置的结尾或,

      现在,您甚至不需要 捕获 组,您可以使用 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 )
      

      【讨论】:

        猜你喜欢
        • 2014-01-28
        • 1970-01-01
        • 2015-10-05
        • 2021-07-31
        • 1970-01-01
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多