Вы можете сделать это следующим образом:
$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
, чтобы удалить его.
В зависимости, как выглядит ваш строку, этот вариант, unrools петлю (?:[^p\s]+|p+(?!u(?:ll|sh)))*+
(который заменяет более явно \S*
) может быть более производительным:
(?:\s*+[^p\s]*+(?:p+(?!u(?:ll|sh))[^p\s]*)*+pu(?:ll|sh)\S*)+
о possessive quantifiers и lookarounds
'pu (?: Ll | sh)' это лучше, чем 'push | pull'? я имею в виду производительность? – vks
@vks: Теоретически да, потому что вам не нужно разбирать 'pu' два раза в худшем случае, поэтому у вас есть небольшой выигрыш. –