替换除缩写之外的所有标点符号

时间:2017-08-03 12:06:43

标签: php regex

我在PHP中有一个正则表达式,用空格替换了我不想要的所有内容

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

但是有一个例外,我想保留缩写的标点符号。

示例:

  

F.B.I.Federal.Bureau.of.Investigation => 'F B I联邦局   调查'

     

S.W.A.T.Team => 'W W A T Team'

应该是:

  

F.B.I.Federal.Bureau.of.Investigation => '联邦调查局。联邦局   调查'

     

S.W.A.T.Team => '扑打。队

PHP代码:

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

所以逻辑是,它应该检查第一场比赛的第二个字符,如果它是'。' char,然后不要替换。 不确定这是否可以使用正则表达式,那么我将非常感谢使用PHP的替代方案。

1 个答案:

答案 0 :(得分: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反向引用):任意Unicode大写字母后面出现1个或多个,后面有一个点
  • | - 或
  • [^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}]替换为{{1} }}

可以通过添加更多缩写来更新,也可以通过缩小备选方案来增强。