PHP RegEx для удаления двойных пробелов между 2 словами

Мне нужен 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);

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

1

Решение

Вы можете сделать это с помощью такого шаблона, используя \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

демонстрация

2

Другие решения

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

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

Посмотреть демо на eval.in


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

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

Демо на regex101

1

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

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

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

Regex101 Демо здесь.

Шаг 2: Заменить double spaces или же multiple tabs в найденном тексте, используя простой \s+,

Regex101 Демо здесь.

0

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

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

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

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

$s = preg_replace('/  */', ' ', $s);
-1
По вопросам рекламы [email protected]