根据子字符串删除字符串

时间:2015-02-24 10:21:41

标签: php regex

我想从字符串中删除子字符串。这些子字符串始终位于空格之间,并包含pushpull

我们说我有以下字符串:

col-md-4 col-sm-6 col-md-pull-6 col-sm-push-4

我如何获得以下内容(使用PHP preg_replace)?

col-md-4 col-sm-6

3 个答案:

答案 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*)+

possessive quantifierslookarounds

答案 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);

DEMO