2015-03-13 62 views
2

考慮的文本替換有條件的正則表達式替換

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

以下的正則表達式規則,當且僅當它後面或者ab$mystring這將空白字符替換$myitem

我的要求是不是一個空白字符來代替它,但用來替換:

a如果a遇到或b如果b遇到。

我不能做到這一點在兩次迭代,如:

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

,因爲第一次迭代也會對$mystring一些副作用,使第二條規則在這種情況下無用。

有沒有辦法在單個迭代中執行此條件替換?

編輯響應答案

OK我已經簡單化我的問題,但這裏是實際的正則表達式規則

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

現在,在這種情況下,我怎麼算反向引用數,因爲我看到一些有條件的分組也是如此。

回答

4

您可以捕捉和替代使用backrefence:

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

感謝,但我已經簡單化我正則表達式規則。我現在編輯我的問題,包括實際的正則表達式。你能告訴我在這種情況下如何計算反向引用數? – oat 2015-03-13 19:58:08

+0

這個正則表達式用於整個單詞替換,當單詞也可能包含特殊字符,因此簡單的單詞邊界可能不起作用。我從這裏借用了這條規則:http://stackoverflow.com/questions/8267307/regex-expression-to-match-whole-word/8267757#8267757 – oat 2015-03-13 20:07:05

+0

請參閱EDIT問題之前您有樣品輸入/輸出。沒有這些,就很難理解這些要求。海事組織在獲得答案後改變問題也是不公平的。如果問題過於簡單,那麼你也可以提出一個新問題。 – anubhava 2015-03-13 20:10:07

2

您可以捕獲並替換:

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

謝謝,但我過分簡化了我的正則表達式規則。我現在編輯我的問題,包括實際的正則表達式。你能告訴我在這種情況下如何計算反向引用數? – oat 2015-03-13 19:57:50