2012-04-25 164 views
3

我在將preg_match_all中使用的某些正則表達式轉換爲在preg_replace中使用時遇到了一些困難。PHP正則表達式幫助(從preg_match_all轉換爲preg_replace)

基本上,只通過正則表達式,我想匹配大寫字母,前面是空格,文本開頭或者一個超文本。這不是一個問題,這個效果很好,我有以下:

preg_match_all('/(?<= |\A|-)[A-Z]/',$str,$results); 
echo '<pre>' . print_r($results,true) . '</pre>'; 

現在,我想要做什麼,就是用的preg_replace只與符合我條件的大寫字符返回字符串以上。如果我將正則表達式直接移入preg_replace,那麼它顯然會替換我想保留的字符。

任何幫助,將不勝感激:)

此外,我充分意識到正則表達式是不是該在效率方面的最佳解決方案,但儘管如此,我想使用的preg_replace。

+0

你可以簡單地將你的正則表達式的否定變成preg_replace嗎? – Ina 2012-04-25 20:05:59

+0

@Ina你的意思是在正則表達式中增加一個(!)如果是這樣,我試過了,但是因爲後面的效果,效果不一樣 – 2012-04-25 20:17:58

回答

2

De Morgan's laws,如果你想保留那些

  • A-Z字母
  • 前面加[space]\A-

那麼你想刪除的

  • A-Z
  • 通過[space]之前,\A-

也許這角色(用空字符串替換匹配)?

/[^A-Z]|(?<! |\A|-)./ 

參見example here

+0

這是完美的,所以它現在匹配非AZ,然後對未前置字符由那些角色。 非常感謝您對此的幫助:) – 2012-04-25 20:32:17

1

我認爲這將是這樣的:

$sString = preg_replace('@.*?(?<= |\A|-)([A-Z])([a-z]+)@m',"$1", $sString); 
+0

嗨,安東,謝謝你的回覆。刪除我想保留的字符 – 2012-04-25 20:13:51

+0

您可以發佈測試文本嗎?:)通過一些示例可以更容易地爲您提供幫助。 – Anton 2012-04-25 20:14:44

+0

$ str =「這是一個測試字符串和東西」; 當然,這是我正在使用的測試字符串,並且使用preg_match_all,它將返回TIATSAS,並且我想使用preg_replace來保留這些字符 – 2012-04-25 20:15:50