2017-08-03 45 views
2

我在PHP正則表達式替換一切,我不想用空格替換所有的標點符號除了縮寫

/[^a-z0-9\p{L}]/siu 

但有這一個例外,我想繼續爲標點符號的縮寫。

例子:

FBIFederal.Bureau.of.Investigation => 'FBI聯邦統計局 調查'

SWATTeam => '特勤隊'

應:

FBIFederal.Bureau.of.Investigation =>'FBI聯邦局 調查'

S.W.A.T.Team =>'S.W.A.T.團隊「

PHP代碼:

$s = "F.B.I.Federal.Bureau.of.Investigation"; 
return preg_replace('/[^a-z0-9\p{L}]/siu', " ", $s); 

所以邏輯是,它應該檢查的第一場比賽的第二個字符,如果它是一個」「。字符,然後不要替換。 不知道這是否可能與正則表達式,然後我會很感激與PHP的替代。

+0

其他縮寫呢?像「博士」,「夫人」等? –

+1

實際上,沒有可靠的方法來做到這一點。 –

+0

@WiktorStribiżew嗯,很好的問題..我認爲這些會更難。我可以硬編碼這些忽略 – Rumplin

回答

0

實際上,縮寫有很多種類型,正如Jon Stirling所說,這裏沒有真正的100%工作解決方案,因爲您需要一個可能的縮寫列表來篩選出來。您可以查看一下fancy regex solution by @ndn,並在那裏獲取與縮寫相關的模式部分。

如果你只需要處理這樣的問題的模式,你可以考慮使用

'~(\b(?:\p{Lu}\.){2,})|[^0-9\p{L}]~u' 

或 - 如果D.Word也應被視爲一個縮寫:

'~(\b(?:\p{Lu}\.)+)|[^0-9\p{L}]~u' 

'$1 '取代。請參閱regex demo

圖案的詳細資料

  • (\b(?:\p{Lu}\.)+) - 第1組(後來與$1反向引用引用):1次以上隨之出現任何Unicode大寫字母和一個圓點後
  • | - 或
  • [^0-9\p{L}] - 任何不是ASCII碼和Unicode字母的字符。

這裏是@ NDN的縮寫正則表達式的變體:

'~\b((?:[Ee]tc|St|Gen|Hon|Prof|Dr|Mr|Ms|Mrs|[JS]r|Col|Maj|Brig|Sgt|Capt|Cmnd|Sen|Rev|Rep|Revd|pp|[Vv]iz|i\.?\s*e|[Vvol]|[Rr]col|maj|Lt|[Ff]ig|[Ff]igs|[Vv]iz|[Vv]ols|[Aa]pprox|[Ii]ncl|Pres|[Dd]ept|min|max|[Gg]ovt|lb|ft|c\.?\s*f|vs|\p{Lu}(?:\.\p{Lu})+)\.)|[^0-9\p{L}]~' 

regex demo

如果你不想刪除-(),只要確保它們添加到否定字符類,有[^0-9\p{L}()-]更換[^0-9\p{L}]

可以通過添加更多縮寫或通過縮小備選方案來增強更新。

+0

這很好,只是'2015-2017'的一個問題,它也刪除了減號 – Rumplin

+0

修復:[^ 0-9 \ p {L} \ - \)\(] – Rumplin

+0

如果你想確保你做不刪除任何特定的字符,是的,你可以將它們添加到否定的字符類中,我更新了答案。 –

相關問題