2016-02-27 5 views
1

Мне нужен Php-RegEx, чтобы найти все пробелы между ключевым словом start-keyword и end-keyword и удалить их.PHP RegEx для удаления двух пробелов между двумя словами

$teststring = 'This is a teststring ... :keyword_start: this is the content with double spaces :keyword_end: more text ... :keyword_start: this is the second content with double spaces :keyword_end: ... more text'; 

мне нужен результат последующих:

This is a teststring ... :keyword_start: this is the content with double spaces :keyword_end: more text ... :keyword_start: this is the second content with double spaces :keyword_end: ... more text 

Это то, что я пробовал: (Но это не работает)

$teststring = preg_replace('#(:keyword_start:)\s\s+(:keyword_end:)#si', '', $teststring); 

Может кто-нибудь мне помочь?

+0

Попробуйте это [http://stackoverflow.com/questions/2368539/php-replacing-multiple-spaces-with-a-single-space](http:// stackoverflow.com/questions/2368539/php-replacing-multiple-spaces-with-a-single-space) –

ответ

2

Вы можете сделать это с такой шаблон с использованием \G якоря. Этот якорь соответствует позиции после предыдущего совпадения (и начало строки по умолчанию). С его помощью вы можете получить непрерывные матчи (до тех пор, пока перерыв примыкания):

$pattern = '~(?:\G(?!\A)|:keyword_start:\s)(?:(?!:keyword_end:)\S+\s)*+\K\s+~S'; 

$result = preg_replace($pattern, '', $str); 

детали картина:

~    # pattern delimiter 
(?:   # non-capturing group 
    \G(?!\A)    # contiguous branch (not at the start of the string) 
    |      # OR 
    :keyword_start:\s # start branch 
) 
(?: 
    (?!:keyword_end:)\S+ # all non-blank characters that are not the "end word" 
    \s     # a single space 
)*+     # repeat the group until a double space or the "end word" 
\K     # remove all on the left from the match result 
\s+     # spaces to remove 
~S  # "STUDY" modifier to improve non anchored patterns 

demo

-1

Если вы хотите регулярное выражение, чтобы заменить все пробелы, включая вкладки и пустые строки, вы можете использовать это:

$s = preg_replace('/\s+/', ' ', $s); 

Он заменит TAB и символ новой строки, даже если это только один, между символами. Несколько (любых) пробелов будут уменьшены до одного символа пробела.

Regex только для нескольких пространств здесь (но в этом случае быстрее использовать str_replace, как и в другом ответе здесь)

$s = preg_replace('/ */', ' ', $s); 
0

Ну я не хорошо в PHP, поэтому я дам решение независимо от того, язык. Это будет полезно, поскольку вы можете выбрать свой язык и реализовать его аналогичным образом.

Итак, решение. Ну, нет простого способа найти double space между двумя keywords. Там может быть элитный regex. Но мой подход довольно прост.

Шаг 1: Найдите текст между keywords, достигнутый с помощью (?<=:keyword_start:).*?(?=:keyword_end:).

Regex101 Demo here.

Шаг 2: Заменить double spaces или multiple tabs в найденном тексте с помощью простых \s+.

Regex101 Demo here.

1

Вы можете использовать callback на то, что между словами.

$str = preg_replace_callback('/:keyword_start:(.*?):keyword_end:/s', function ($m) { 
    return ':keyword_start:' . preg_replace('/\s{2,}/', " ", $m[1]) . ':keyword_end:'; 
}, $str); 
  • (.*?) между маркерами captureslazily любое количество любых символов $1
  • \s{2,} соответствует двум или более whitespaces
  • sflag после закрытия разделителя делает матч точка новой строки

See demo at eval.in


Это может быть сделано с одним изящными регулярными выражениями, но более склонны к сбою & объяснения занимает больше времени. Что-то вроде

/(?::keyword_start:|\G(?!^)\S+)\K(?<!_end:)\s+/ 

Demo at regex101

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