将两个preg_replace模式组合为一个


Combining two preg_replace patterns into one

直截了当的问题;如何将以下两种preg_replace模式组合为一?

preg_replace( '/(?<!'d)[.,!?](?![.,!?'d])/', '$0 ', $filecontent);
preg_replace('/'s's+/', ' ', $filecontent);

第一个答案来自这个答案,而第二个则只是消除了对空间的过度使用。

我试着做一些链式的事情(见下面评论的一行),但没有成功——我想这也不是最好的解决方案。

$fp2 = fopen($filepath, 'r+');
$filecontent = file_get_contents($filepath);
$correctedpunctation = preg_replace( '/(?<!'d)[.,!?](?![.,!?'d])/', '$0 ', $filecontent);
/* $correctedspacing = preg_replace('/'s's+/', ' ', $correctedpunctation); */
/* fwrite($fp2, $correctedpunctation); */
fwrite($fp2, $correctedpunctation);
fclose($fp2);

我一直在尝试阅读正则表达式,但我不熟悉使用这种字符替换,发现这些模式很难阅读和理解。我似乎无法在不破坏这个preg_replace的部分或全部预期功能的情况下将它们添加在一起。任何解释和/或示例都将不胜感激。

您可以使用组合它们

preg_replace( '/(?<!'d)([.,!?])(?![.,!?'d])|'s{2,}/', '$1 ', $filecontent);

RegEx演示