php заменить слово необязательными скобками - PullRequest
2 голосов
/ 03 ноября 2019

Я хочу удалить только последние "world" в строке ниже. я тоже хочу круглые скобки .. это должно быть необязательно.

например, оба:

$string = 'this is my world, not my (world)';
$string = 'this is my world, not my world';

результат должен быть this is my world, not my

код:

  $string = 'this is my world, not my (world)';
  $find = 'world';
  $replace = '';
  $result = preg_replace(strrev("/$find/"),strrev($replace),strrev($string),1);
  echo strrev($result);

Ответы [ 2 ]

1 голос
/ 03 ноября 2019

В PHP (PCRE) вы можете использовать эту условную конструкцию регулярного выражения :

(.*)\h+(\()?world(?(2)\)|\b)

И заменить на:

$1

Подробности RegEx:

  • (.*): сопоставить 0 или более символов в начале (жадное или самое длинное совпадение) и захватить его в группе # 1
  • \h+: сопоставить 1 илибольше горизонтальных пробелов
  • (\()?: Опционально соответствует открытию ( и захватывает его в группе # 2
  • world: текст соответствия world
  • (?(2)\)|\b): если присутствует группа захвата 2, то соответствует ), в противном случае соответствует границе слова

Код PHP:

$repl = preg_replace('/(.*)\h+(\()?world(?(2)\)|\b)/', '$1', $str);

RegEx Demo

1 голос
/ 03 ноября 2019

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

$input = 'this is my world, not my (world)';
$output = preg_replace("/(?:\(world\)|\bworld\b)(?!.*\bworld\b)/", "", $input);
echo $input . "\n" . $output;

Это напечатает:

this is my world, not my (world)
this is my world, not my 

Вот объяснение шаблона регулярного выражения:

(?:              match (but do not capture)
    \(world\)    either (world)
    |            OR
    \bworld\b    world
)
(?!.*\bworld\b)  assert that no other occurrence of world or (world) occurs
                 later in the string
...