2017-08-03 46 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

如果你想确保你做不删除任何特定的字符,是的,你可以将它们添加到否定的字符类中,我更新了答案。 –

相关问题