Мне нужен 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);
Может кто-нибудь мне помочь ?
Вы можете сделать это с помощью такого шаблона, используя \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
Вы можете использовать Перезвоните на то, что между словами.
$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
флаг после закрытия разделитель делает точку совпадением с новой строкойЭто может быть сделано с одним изящным регулярным выражением, но более склонным к неудаче & объяснение занимает больше времени. Что-то вроде
/(?::keyword_start:|\G(?!^)\S+)\K(?<!_end:)\s+/
Ну, я не хорош в php, поэтому я дам решение независимо от языка. Это будет полезно, так как вы можете выбрать свой язык и реализовать его аналогичным образом.
Итак, решение. Ну, нет простого способа найти double space
между двумя keywords
, Там могут быть некоторые элита регулярное выражение. Но мой подход довольно прост.
Шаг 1: Найти текст между keywords
достигается с помощью (?<=:keyword_start:).*?(?=:keyword_end:)
,
Шаг 2: Заменить double spaces
или же multiple tabs
в найденном тексте, используя простой \s+
,
Если вы хотите, чтобы регулярные выражения заменяли все пробелы, включая табуляции и пустые строки, вы можете использовать это:
$s = preg_replace('/\s+/', ' ', $s);
Он заменит TAB и символ новой строки, даже если он только один, между символами. Несколько (любых) пробелов будут уменьшены до одного пробела.
Здесь есть регулярное выражение только для нескольких пробелов (но в этом случае быстрее использовать str_replace, как в другом ответе здесь)
$s = preg_replace('/ */', ' ', $s);