【问题标题】:php replace regular expressionphp替换正则表达式
【发布时间】:2011-02-21 10:13:26
【问题描述】:

如果没有,我需要使用php在句点和下一个单词/字母之间添加一个空格。

例如,“这是一个句子。这是下一个句子。”需要变成“这是一个句子。这是下一个。”请注意第一个句号后添加的空格。

我的问题是,即使我能够创建一个正则表达式来查找每个点后跟一个字母,我该如何用“点 + 空格”替换那个点并保留字母?

还需要保持字母的大小写,小写或大写。

感谢您的意见。

【问题讨论】:

  • 通过正则表达式执行此操作将导致错误结果,例如 This is a sentence."And is a quote." And this contains three dots... 以及所有其他类型的点有效但后面的空格错误的情况。事实上,您无法使用正则表达式正确解析自然语言,甚至更复杂的工具也很难做到这一点。
  • 虽然这是真的,但它至少可以让我纠正一些最明显的错误。

标签: php regex replace


【解决方案1】:
$regex = '#\.(\w)#';
$string = preg_replace($regex, '. \1', $string);

如果您想捕获的不仅仅是句点,您可以这样做:

preg_replace('#(\.|,|\?|!)(\w)#', '\1 \2', $string);

只需将要替换的字符添加到第一个 () 块中。不要忘记转义特殊字符 (http://us.php.net/manual/en/regexp.reference.meta.php)

【讨论】:

  • 非常感谢!所以基本上 \1 是包含字母的变量。你介意解释一下还是给我指点我能更好理解的地方?
  • \1 是第一组中捕获的内容(正则表达式包含在第一组括号中)。这称为反向引用。
  • 如果你在点后面有一个单词字符以外的其他东西,比如字符串“Foo.-Bar”
  • 如果我想为句号或逗号执行此操作。现在我需要两个反向引用,对吗?那将如何运作?谢谢。
【解决方案2】:
$str = "Will you please slow down?You're gonna kill someone.Seriously!";
echo preg_replace('/(!|\?|\.)([^\s\.\?!])/', '\1 \2', $str);

【讨论】:

  • 仅供参考,(!|\?|\.) 可以写成[!?.],这样更高效也更易读。
  • @Alan,您还需要将 [] 包装在 () 中,以便反向引用工作 ([!?.])...
  • @Alan Moore:是的。但是我想看看 ircmaxell 是否会逐字复制它(如您所见,我确实在第二个中使用了括号,尽管有多余的空格)。哈哈哈哈哈
【解决方案3】:
$str = "这是一个句子。这是下一个。"; echo preg_replace("#\.(\S)#", '.\1', $str);

【讨论】:

  • 这会错误地将“this...”变成“this...”
  • @ircmaxell,这正是 OP 所要求的;如果以下字符不是空格,请添加一个句点(我使用了非空格)。可能还有很多其他情况也不起作用,例如 URI。
猜你喜欢
  • 2013-12-09
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多