我想从字符串中删除子字符串。这些子字符串始终位于空格之间,并包含push
或pull
。
我们说我有以下字符串:
col-md-4 col-sm-6 col-md-pull-6 col-sm-push-4
我如何获得以下内容(使用PHP preg_replace
)?
col-md-4 col-sm-6
答案 0 :(得分:3)
你可以这样做:
$result = preg_replace('~(?:\s*+\S*pu(?:ll|sh)\S*)+~', '', $str);
模式细节:
~ # pattern delimiter
(?: # open a non capturing group
\s*+ # zero or more whitespaces (possessive)
\S* # zero or more non-whitespaces
pu(?:ll|sh) # push or pull
\S*
)+ # repeat the non capturing group (1 or more)
~
注意:如果字符串以" push"开头或者" pull",这种模式可能会让一个前导空格,在这种情况下,使用rtrim
来删除它。
根据字符串的显示方式,取消循环(?:[^p\s]+|p+(?!u(?:ll|sh)))*+
(更明确地替换\S*
)的此变体可能更具性能:
(?:\s*+[^p\s]*+(?:p+(?!u(?:ll|sh))[^p\s]*)*+pu(?:ll|sh)\S*)+
答案 1 :(得分:1)
[^ ]*(?:push|pull)[^ ]*
试试这个。empty string
。见。演示。
或
\s*[^\s]*(?:push|pull)[^\s]*
https://regex101.com/r/aI4rA5/7
$re = "/[^ ]*(?:push|pull)[^ ]*/m";
$str = "col-md-4 col-sm-6 col-md-pull-6 col-sm-pull-4";
$subst = "";
$result = preg_replace($re, $subst, $str);
答案 2 :(得分:1)
它还会删除子字符串之前存在的空格。
\h+\S*\b(?:push|pull)\b\S*|^\S*\b(?:push|pull)\b\S*\h+
代码:
$re = "/\\h+\\S*\\b(?:push|pull)\\b\\S*|^\\S*\\b(?:push|pull)\\b\\S*\\h+/m";
$str = "col-md-4 col-sm-6 col-md-pull-6 col-sm-pull-4\ncol-md-pull-6 foo bar";
$subst = "";
$result = preg_replace($re, $subst, $str);