【问题标题】:Php put a space in front of capitals in a string (Regex)php 在字符串中的大写字母前面放置一个空格(正则表达式)
【发布时间】:2010-11-08 13:03:54
【问题描述】:

我有许多字符串,其中包含捆绑在一起的单词,我需要将它们分开。

例如 ThisWasCool - 这很酷
MyHomeIsHere - 我的家在这里

我正在慢慢了解正则表达式,我相信要做到这一点,我应该使用 preg_replace。我的问题是将表达式放在一起以找到匹配项。

我只到此为止

   preg_replace('~^[A-Z]~', " ", $string)

每个字符串都包含很多单词,但只有第一个单词包含成束的单词,因此使用我上面的示例字符串将是
“ThisWasCool 再次拜访您” - “ThisWasCool 再次拜访您”

我已经告诉它从头开始,并寻找大写字母,但我不知道该怎么做 - 仅限于每个字符串的第一个单词 - 如何在空格后的替换部分重用大写字母

【问题讨论】:

  • "\n" 用于替换。你是说空格还是换行符?
  • 来晚了,我的意思是空格,通常我会放“”,但那可能是错误的!

标签: php regex


【解决方案1】:

问题

  1. 您的正则表达式 '~^[A-Z]~' 将仅匹配第一个大写字母。查看Pattern Syntax 中的Meta Characters 了解更多信息。

  2. 您的替换是换行符 '\n' 而不是空格。

解决方案

使用此代码:

$String = 'ThisWasCool';
$Words = preg_replace('/(?<!\ )[A-Z]/', ' $0', $String);

(?&lt;!\ ) 是一个 assertion,它将确保我们不会在已经有空格的大写字母之前添加空格。

【讨论】:

  • 如何跳过第一个大写字母的空格?
  • 我知道了:preg_replace('/(?
  • 而且,如果您需要一个不分隔连续大写字母的字符(例如,BusinessUnitID 应该是 Business Unit ID,而不是 Business Unit ID),那么您可以使用 /(?
【解决方案2】:
$string = preg_replace('/[A-Z]/', ' $0', $string);

之后可能会通过ltrim 运行结果。

$string = ltrim(preg_replace('/[A-Z]/', ' $0', $string));

【讨论】:

  • 谢谢 我猜 / 是分隔符,有没有办法限制它只处理第一个单词?数据来自 csv,因此第一个单词包含在“”中?
  • 是的,有。我建议使用 ltrim 删除空格,但您也可以在表达式中使用:/\B[A-Z]/
【解决方案3】:

这是我的 .02c,这个版本只会作用于第一个单词,并且会保留大写字母序列 (BMW)。

$str = "CheckOutMyBMW I bought it yesterday";
$parts = explode(' ', $str);
$parts[0] = preg_replace('~([a-z])([A-Z])~', '\\1 \\2', $parts[0]);
$newstr = implode(' ', $parts);
echo $newstr;

【讨论】:

    【解决方案4】:

    我不精通正则表达式,但我建议如下代码:

    $string="ThisWasCool to visit you again";
    $temp = explode(' ',$string, 2);
    $temp[0] = preg_replace('/(.)([A-Z])/','$1 $2', $temp[0]);
    $string = join(' ',$temp);
    

    查看 SirLancelot 代码,我有第二个解决方案。我仍然更喜欢explode解决方案,因为您说您的目标只是字符串的第一个单词。

    $string="ThisWasCool to visit you again";
    $temp = explode(' ',$string, 2);
    $temp[0] = preg_replace('/(?<!^)([A-Z])/',' $0', $temp[0]);
    $string = join(' ',$temp);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2019-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多