首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex OR语句在没有空格的情况下不能工作

Regex OR语句在没有空格的情况下不能工作
EN

Stack Overflow用户
提问于 2014-02-15 19:17:51
回答 2查看 232关注 0票数 2

我试图让这个正则表达式匹配(一两次)这些字符串的出现:边框-box,padding,content

这里是正则表达式:

代码语言:javascript
复制
((?:border-box|padding-box|content-box){1,2})

下面是示例字符串:

代码语言:javascript
复制
background: url("my image.jpg") left right 2px 50% 75% repeat-x round scroll border-box padding-box;

预期结果:

代码语言:javascript
复制
border-box padding-box

实际结果:

代码语言:javascript
复制
Array
(
    [0] => border-box
    [1] => border-box
)

哦,顺便说一下,我正在使用这个站点来测试我的regex:http://www.phpliveregex.com/注意:我使用的是preg_match而不是preg_match_all

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-15 19:21:17

问题是,您的模式要求重复立即发生在彼此之后,之间没有空格。

尝试在交替之后添加一个\s*,以便允许重复之间的可选空格,如下所示:

代码语言:javascript
复制
(?:(?:border-box|padding-box|content-box)\s*){1,2}

甚至更好:

代码语言:javascript
复制
(?:(?:border|padding|content)-box\s*){1,2}

注意,由于*,这也将匹配像border-boxborder-box这样的字符串(在重复之间没有空格)。如果这是一个问题,您可以尝试这样的模式:

代码语言:javascript
复制
(?:(?:border|padding|content)-box)(?:\s+(?:border|padding|content)-box)?

请注意,我已经删除了周围的(…),因为这个组将始终与整个匹配完全相同,所以几乎没有必要。

票数 2
EN

Stack Overflow用户

发布于 2014-02-15 19:21:29

使用preg_match_all()解决方案

您试图匹配多个值,所以使用preg_match_all()而不是preg_match()

代码语言:javascript
复制
$ok = preg_match_all('/(border-box|padding-box|content-box)/', $str, $matches);

if ($ok) {
    $result = implode(' ', $matches[0]);
    var_dump($result);
}

输出:

代码语言:javascript
复制
string(22) "border-box padding-box"

Demo

使用preg_match()的解决方案

您当前的正则表达式无法工作,因为它没有考虑到空格。您可以如下所示修改正则表达式。

代码语言:javascript
复制
((?:(?:border-box|padding-box|content-box)\s*){1,2})

解释:

  • (?:border-box|padding-box|content-box) -非捕获组
  • \s* -匹配任意空格字符(字符类[\r\n\t\f ]的缩写)零次或多次
  • {1,2} -匹配前一组1到2次

输出:

代码语言:javascript
复制
string(22) "border-box padding-box"

Demo

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21802365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档