我试图让这个正则表达式匹配(一两次)这些字符串的出现:边框-box,padding,content
这里是正则表达式:
((?:border-box|padding-box|content-box){1,2})下面是示例字符串:
background: url("my image.jpg") left right 2px 50% 75% repeat-x round scroll border-box padding-box;预期结果:
border-box padding-box实际结果:
Array
(
[0] => border-box
[1] => border-box
)哦,顺便说一下,我正在使用这个站点来测试我的regex:http://www.phpliveregex.com/注意:我使用的是preg_match而不是preg_match_all
发布于 2014-02-15 19:21:17
问题是,您的模式要求重复立即发生在彼此之后,之间没有空格。
尝试在交替之后添加一个\s*,以便允许重复之间的可选空格,如下所示:
(?:(?:border-box|padding-box|content-box)\s*){1,2}甚至更好:
(?:(?:border|padding|content)-box\s*){1,2}注意,由于*,这也将匹配像border-boxborder-box这样的字符串(在重复之间没有空格)。如果这是一个问题,您可以尝试这样的模式:
(?:(?:border|padding|content)-box)(?:\s+(?:border|padding|content)-box)?请注意,我已经删除了周围的(…),因为这个组将始终与整个匹配完全相同,所以几乎没有必要。
发布于 2014-02-15 19:21:29
使用preg_match_all()的解决方案
您试图匹配多个值,所以使用preg_match_all()而不是preg_match()
$ok = preg_match_all('/(border-box|padding-box|content-box)/', $str, $matches);
if ($ok) {
$result = implode(' ', $matches[0]);
var_dump($result);
}输出:
string(22) "border-box padding-box"使用preg_match()的解决方案
您当前的正则表达式无法工作,因为它没有考虑到空格。您可以如下所示修改正则表达式。
((?:(?:border-box|padding-box|content-box)\s*){1,2})解释:
(?:border-box|padding-box|content-box) -非捕获组\s* -匹配任意空格字符(字符类[\r\n\t\f ]的缩写)零次或多次{1,2} -匹配前一组1到2次输出:
string(22) "border-box padding-box"https://stackoverflow.com/questions/21802365
复制相似问题