【问题标题】:Combining two preg_replace patterns into one将两个 preg_replace 模式合二为一
【发布时间】:2015-02-10 18:04:58
【问题描述】:

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

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

第一个来自this answer,而第二个只是删除了过度使用的空格。

我尝试做一些类似链的事情(请参阅下面注释掉的行),但这没有奏效——而且我猜它也不是最好的解决方案。

$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);

我一直在尝试阅读 regular expressions,但我不熟悉使用这种字符替换,并且发现这些模式很难阅读和理解。如果不破坏此 preg_replace 的部分或全部预期功能,我似乎无法将它们添加在一起。任何解释和/或示例将不胜感激。

【问题讨论】:

  • 如果他们都做完全独立的事情,那么将它们分开应该没有问题。只是想知道为什么要合并它们。此外,您可能会在前瞻中添加\s,以防止在标点符号后跟空格的情况下添加空格。比如:...(?![.,!?\d\s])

标签: php regex string formatting preg-replace


【解决方案1】:

您可以使用以下方式组合它们:

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

RegEx Demo

【讨论】:

  • 谢谢你,尤其是那个链接!在了解谁使用这类东西时,该网站对我有很大帮助。
猜你喜欢
  • 1970-01-01
  • 2017-04-04
  • 2015-12-30
  • 2019-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
相关资源
最近更新 更多