【问题标题】:PHP to SEARCH the Upper+Lower Case mixed Words in the strings?PHP搜索字符串中的大写+小写混合词?
【发布时间】:2012-07-20 14:06:36
【问题描述】:

假设有一个字符串:

A quick brOwn FOX called F. 4lviN

我想要TO SEARCH的WORDS必须具备以下条件:

  • 包含混合大小写的单词
  • 仅包含字母 A 到 Z (A-Z a-z)
    (例如:没有数字、没有逗号、没有句号、没有破折号等)

所以假设,当我搜索时(例如在这个字符串中),搜索结果将是:

brOwn

因为它是唯一同时包含大写和小写字母的单词(也只包含字母)。

那么我怎样才能让它在 php 中工作呢?

【问题讨论】:

    标签: php regex search preg-match str-replace


    【解决方案1】:

    你应该擅长:

    preg_match_all("/\b([a-z]+[A-Z]+[a-zA-Z]*|[A-Z]+[a-z]+[a-zA-Z]*)\b/", $input, $matches);
    print_r($matches[1]); 
    

    编辑:由于不需要捕获,也可以>>

    preg_match_all("/\b(?:[a-z]+[A-Z]+[a-zA-Z]*|[A-Z]+[a-z]+[a-zA-Z]*)\b/", $input, $matches);
    print_r($matches[0]); 
    

    【讨论】:

    • 完美Ωmega !!那是惊人的正则表达式。既然这是一个有趣的话题,我想知道为什么很多人想对我的问题投反对票。 :/ 你能投赞成票吗?
    • @Ωmega 捕获组(..)和 [a-zA-Z] 是多余的和/或不是必需的。这留下了'/\b(?:[a-z]+[A-Z]+[A-z]*|[A-Z]+[a-z]+[A-z]*)\b/' 作为正则表达式。如果没有捕获组,现在可以在 print_r($match[0]) 找到结果。
    • @rubberboots - 你是对的,我在发布后发现,在这种情况下我不需要分组,如果没有分组,那么我应该使用 $matches[0] 作为输出,但因为它工作正常并被接受,然后我放弃了......但我要更新它......谢谢。
    • @Ωmega - 不,分组是必要的(但不需要捕获),否则第一个 \b 仅适用于第一个备选方案,第二个 \b 仅适用于第二个备选方案选择。您可以摆脱分组,但\b 需要出现在两个选项的开头和结尾。
    • @ridgerunner - 天哪!你说的对。我再次编辑了它。现在好了吗?对不起大家,我今天累了:)
    【解决方案2】:

    Ωmega 的回答很好用。只是为了好玩,这里有一个备用(注释)正则表达式,它使用前瞻来解决问题:

    <?php // test.php Rev:20120721_1400
    $re = '/# Match word having both upper and lowercase letters.
        \b               # Assert word begins on word boundary.
        (?=[A-Z]*[a-z])  # Assert word has at least one lowercase.
        (?=[a-z]*[A-Z])  # Assert word has at least one uppercase.
        [A-Za-z]+        # Match word with both upper and lowercase.
        \b               # Assert word ends on word boundary.
        /x';
    
    $text ='A quick brOwn FOX called F. 4lviN';
    
    preg_match_all($re, $text, $matches);
    $results = $matches[0];
    print_r($results);
    ?>
    

    【讨论】:

      【解决方案3】:

      您可以使用简单的正则表达式,例如:

      /\s[A-Z][a-z]+\s/
      

      可以这样使用:

      preg_match_all('/\s[A-Z][a-z]+\s/', 'A quick Brown FOX called F. 4lvin', $arr);
      

      然后你的 $arr 变量已经添加了所有匹配项,将包含这些单词的数组:

      Array
      (
          [0] => Array
          (
              [0] => Brown
          )
      
      )
      

      编辑:改变了模式。

      【讨论】:

      • 考虑在输入字符串中加入类似this is a bRown fOx 1Yes2 4No Maybe5 etc. 的内容。您的代码将找到YesNoMaybe,它们都不是很好的匹配项,但找不到正确匹配的bRownfOx:-/
      • 是的,我想是的,我没有检查。总是可以指定单词由空格字符分隔:/\s[A-Z][a-z]+\s/ 另外我假设他的意思是先大写然后小写。
      • 那不会再起作用了,因为你不想匹配空格并且你想匹配 fOxbRown... 你应该编辑你的答案,伙计...跨度>
      • 我认为他的意思是从大写开始,然后是小写,因为这是他给出的示例。例如。 “棕色” - 是的。 “棕色” - 没有。
      • 问题是“混合”,仅此而已,所以没有理由相信他想捕捉首字母大写的单词。无论如何,您仍应处理单词边界,不匹配空格,也不匹配1YesNo23Maybe4 等字符串。在行首或行尾,没有前导或尾随空格的单词是什么?还是单词后面有句号?
      猜你喜欢
      • 1970-01-01
      • 2012-01-03
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 2015-02-25
      相关资源
      最近更新 更多