2015-03-13 2 views
2

Рассмотрим следующее регулярное выражение правило для замены текстаУсловный Regex заменить

$mystring = preg_replace('/'.$myitem.'[ab]/', "", $mystring); 

Это заменит $myitem с пробелом в $mystring тогда и только тогда, когда за ним следует либо a или b.

Мое требование не заменить его на пустой символ, но заменить его:

a если a встречается или b если b встречается.

Я не могу сделать это в двух итераций, как:

$mystring = preg_replace('/'.$myitem.'a/', "a", $mystring); 
$mystring = preg_replace('/'.$myitem.'b/', "b", $mystring); 

, потому что первая итерация будет также иметь некоторые побочные эффекты на $mystring делает второе правило бесполезно в этом случае.

Есть ли способ сделать эту условную замену в одной итерации?

редактируется в ответ на ответы

ОК я упростил свой вопрос, но здесь это фактическое правило регулярного выражения

'(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$))'.$myitem.'(?:(?<=^|\s)(?=\S|$)|(?<=^|\S)(?=\s|$)) *([ab])' 

Сейчас в этой ситуации как подсчитать количество обратной ссылки, как я вижу некоторые условные группировки.

ответ

4

Вы можете захватить и использовать backrefence в замене:

$mystring = preg_replace('/'.$myitem.'([ab])/', '$1', $mystring); 
+0

спасибо, но я упростил мое правило регулярного выражения. Теперь я отредактировал свой вопрос, чтобы включить текущее регулярное выражение. Можете ли вы рассказать, как я могу подсчитать номер обратной линии в этом случае? – oat

+0

это регулярное выражение для замены всего слова, когда слова могут также содержать специальные символы, и, следовательно, простые границы слов могут не работать. Я взял это правило здесь: http://stackoverflow.com/questions/8267307/regex-expression-to-match-whole-word/8267757#8267757 – oat

+0

Перед тем, как задать вопрос EDIT, у вас был образец ввода/вывода. Без этого трудно понять требования. ИМО также несправедливо менять вопрос после получения ответов. Если бы вопрос был упрощен, вы могли бы задать и новый вопрос. – anubhava

2

Вы можете захватить и заменить:

$mystring = preg_replace('/'.$myitem.'([ab])/', "\1", $mystring); 
+0

спасибо, но я упростил правило регулярных выражений. Теперь я отредактировал свой вопрос, чтобы включить текущее регулярное выражение. Можете ли вы рассказать, как я могу подсчитать номер обратной линии в этом случае? – oat

Смежные вопросы