PHP preg_replace - заменить текстовую часть, но не слишком скоро - PullRequest
2 голосов
/ 01 октября 2019

Использование:

$text = preg_replace("/\[\[(.*?)SPACE(.*?)\]\]/im",'$2',$text);

для очистки и получения wordtwo

$text = '..text.. [[wordoneSPACE**wordtwo**]] ..moretext..';

, но происходит сбой, если текст имеет [[before

$text = '.. [[ ..text(not to cut).. [[wordoneSPACE**wordtwo**]] ..moretext..';

Как я могу ограничиться только там, где у меня есть только пробел слово?

Ответы [ 2 ]

1 голос
/ 01 октября 2019

Если в [[...]] не может быть [ и ], вы можете использовать

$text = preg_replace("/\[\[([^][]*)SPACE([^][]*)]]/i",'$2',$text);

См. Демонстрационную версию regex . [^][] Отрицательный класс символов будет соответствовать только символу, отличному от [ и ], и не будет пересекать границу [[...]].

В противном случае используйте жадный жетон закаленный :

$text = preg_replace("/\[\[((?:(?!\[{2}).)*?)SPACE(.*?)]]/is",'$2',$text);

См. эту демонстрацию регулярных выражений .

Шаблон (?:(?!\[{2}).)*? будет соответствовать любому символу, 0 или более повторений, но как можно меньше, что неначать [[ последовательность символов и не пересечет границу следующего объекта [[.

0 голосов
/ 01 октября 2019

Другим вариантом может быть использование притяжательных квантификаторов .

. В первой группе вы можете использовать отрицательный класс символов для соответствия любым символам, кроме квадратных скобок или S, если за ним следует пробел. .

\[\[([^][S]++(?:S(?!PACE)|[^][S]+)*+)SPACE([^][]++)\]\]

По частям

  • \[\[ Совпадение [[
  • ( Захват группа 1
    • [^][S]++ Совпадение 1+ раз с любым символом, кроме S,] или [
    • (?: Группа без захвата
      • S(?!PACE) Совпадение либо с S, за которым не следует PACE
      • | Или
      • [^][S]+ Совпадение 1+ раз с любым символом, кроме S,] или [
    • )*+ Закрыть группу и повторить 0+ раз
  • ) Закрыть группу 1
  • SPACE Совпадение буквально
  • ( Захват Группа 2
    • [^][]++ Совпадение 1+ раз с любым символом, кроме ] или [
  • ) Близкая группа
  • \]\] Совпадение ]]

Regex demo

...