2015-02-24 3 views
0

Я хочу удалить подстроки из строки. Эти подстроки всегда между пробелами и содержат либо 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 

ответ

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, чтобы удалить его.

В зависимости, как выглядит ваш строку, этот вариант, unrools петлю (?:[^p\s]+|p+(?!u(?:ll|sh)))*+(который заменяет более явно \S*) может быть более производительным:

(?:\s*+[^p\s]*+(?:p+(?!u(?:ll|sh))[^p\s]*)*+pu(?:ll|sh)\S*)+ 

о possessive quantifiers и lookarounds

+0

'pu (?: Ll | sh)' это лучше, чем 'push | pull'? я имею в виду производительность? – vks

+2

@vks: Теоретически да, потому что вам не нужно разбирать 'pu' два раза в худшем случае, поэтому у вас есть небольшой выигрыш. –

1
[^ ]*(?:push|pull)[^ ]* 

Try this.Replace по 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); 
+1

Спасибо, что делает то обмануть! Я не мог понять, как выбрать целое слово, а не просто «push» или «pull». Вы использовали '*' для этого, верно? –

+0

@CasCornelissen мы выбрали 'non space charactes, затем нажмите или вытащите, а затем пробельные символы'''', чтобы '' символы пробела могли быть от '0 до количества, сколько возможно'. – vks

+0

Справа. Не могли бы мы использовать '\ s', чтобы также соответствовать другим символам новой строки? –

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

Смежные вопросы