【问题标题】:preg_match PHP suggestionspreg_match PHP 建议
【发布时间】:2011-10-27 09:35:45
【问题描述】:

我还不太擅长 preg_match,我想知道是否有人可以帮我一把。 我有一个值数组,例如array("black*", "blue", "red", "grey*") 我需要找到末尾带有* 的值,然后返回它之前的单词。

我相信 preg_match() 是最好的方法,但我愿意接受建议。

提前致谢!

【问题讨论】:

  • 您是否也希望返回没有尾随* 的单词?

标签: php preg-match


【解决方案1】:

如果您必须使用正则表达式...

$words = array_map(function($word) {
   return preg_replace('/\*\z/', '', $word);
}, $arr);

CodePad.

...但是您最好不要使用正则表达式并使用类似...

$words = array_map(function($word) {
   return rtrim($word, '*');
}, $arr);

CodePad.

如果您想只返回结尾有* 的单词,请先尝试这样的操作...

$words = preg_grep('/\*\z/', $arr);

CodePad.

唯一的缺点(如 cmets 中所述)是 PHP 将遍历数组两次。如果您愿意,您可以简单地使用foreach 循环在一个循环中完成这两项操作。

另外,值得一提的是匿名函数是 PHP 5.3 的东西。您仍然可以使用大部分代码,只需将函数分离为它们自己的命名函数并传递对它们的引用。

【讨论】:

  • 不会返回整个值,包括*?要求似乎只捕获单词,而不是 *
  • @e.dan:我不相信它会。检查键盘。
  • 次要 - array_map 先获取数组,然后是回调函数。它会起作用,尽管处理数组两次(一次搜索星号,然后一次检索单词)似乎效率低下。
  • @majelbstoat:我想你会发现array_map() 首先接受回调。至于效率低下,是的,您可以在一个循环中完成,但是您会失去漂亮的功能性:)
  • @alex 的确如此。至于参数的顺序,我将它与 array_filter() 混淆了。啊,PHP,你可爱的 needle-haystack,haystack-needle 参数排序又让我感到困惑 :) - PS,值得注意的是匿名函数仅适用于 PHP 5.3+?
【解决方案2】:

如果你总是有一个这样的数组(即没有复杂的字符串,只有单词*),你真的不应该使用正则表达式,这是一种矫枉过正的做法。 使用字符串函数,例如用于搜索的 strpos 和用于删除 * 的 str_replace 或 rtrim。

如果您不需要花哨的替换规则(如正则表达式),则应始终使用此函数而不是 preg_replace()。

——来自str_replace manual

【讨论】:

    【解决方案3】:

    不需要为此使用 preg_match - 对字符串进行简单的字符查找即可:

    $words = array('red*', 'grey', 'white', 'green*');
    $return = array();
    
    foreach ($words as $word) {
        if ($word[strlen($word) - 1] === '*') {
            $return[] = substr($word, 0, -1);
        }
    }
    var_dump($return);
    

    【讨论】:

    • @alex 你好!我实际上是布里斯班人还有两天,之后我将成为旧金山人(尽管实际上,仍然是 Pom!)
    • 我明白了。好吧,祝你旅途愉快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-29
    • 2011-07-21
    • 2016-07-06
    • 2011-05-18
    • 1970-01-01
    相关资源
    最近更新 更多