php / regex: Как заменить часть найденного шаблона, но оставив остальную часть как есть? - PullRequest
11 голосов
/ 24 января 2010

Как заменить подстроку в найденном шаблоне, но оставив все остальное как есть?

(РЕДАКТИРОВАТЬ: реальный случай, конечно, сложнее, чем в примере ниже, я должен сопоставить вхождения в тегах xml. Вот почему я должен использовать регулярное выражение!)

Допустим, я хочу изменить вхождения слова "X" в слове на букву "Z".

хочу

aaXaa aaX Xaa

стать

aaZaa aaZ Zaa

Поиск вхождений слов, включая "x", не проблема, например:

[^ X \ s] X [^ \ s]

но обычное preg_match заменяет полное совпадение, где я хочу, чтобы в шаблоне было что-нибудь, кроме «X», чтобы оно оставалось таким, как есть.

Какой лучший способ сделать это в php?

Ответы [ 4 ]

14 голосов
/ 24 января 2010

Если ваше регулярное выражение соответствует только соответствующей части, не должно возникнуть никаких проблем, если оно заменяет полное соответствие (например, preg_replace('/X/', 'Z', $string)).

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

preg_replace('/(non-replace)X(restofregex)/', '$1Z$2', $string);
2 голосов
/ 24 января 2010

Если это действительно так просто, как замена X на Z, вы также можете использовать str_replace(), что быстрее, чем preg в этом случае:

$sNew = str_replace("X", "Z", $sOld);
1 голос
/ 24 января 2010

Попробуйте это

<?php
$string = 'The quick brown fox jumped over the lazy dog.';
$patterns[0] = '/quick/';
$patterns[1] = '/brown/';
$patterns[2] = '/fox/';
$replacements[2] = 'bear';
$replacements[1] = 'black';
$replacements[0] = 'slow';
echo preg_replace($patterns, $replacements, $string);
?>

Приведенный выше пример выдаст:

The bear black slow jumped over the lazy dog.
0 голосов
/ 24 января 2010

Вы действительно должны использовать регулярные выражения для этого?

$output = str_replace('X', 'Z', $input);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...