【问题标题】:PHP - preg_match - assign arbitrary value to a matched elementPHP - preg_match - 为匹配的元素分配任意值
【发布时间】:2010-12-01 17:16:48
【问题描述】:

假设我们有这个正则表达式:

preg_match('/\b(xbox|xbox360|360|pc|ps3|wii)\b/i' , $string, $matches);

现在,只要正则表达式匹配 ex。 三个 xbox 方法之一 (xbox|xbox360|360)$matches,应该只返回 XBOX

这可能继续在preg_match() 上下文中工作还是我应该使用其他方法?

先谢谢了。

已编辑:

我实际上是这样做的:

$x = array('xbox360','xbox','360');
if( preg_match('/\b(xbox360|xbox|360|pc|ps3)\b/i', $s, $m ) ) {
  $t = $m[0];
}
if ( in_array($t,$x) ) {
  $t = 'XBOX';
}

我想知道是否还有其他方法!

【问题讨论】:

    标签: php regex preg-match pipe


    【解决方案1】:

    您当前的代码在我看来还不错,如果您想要更高级一点,可以尝试命名子模式

    preg_match('/\b((?P<XBOX>xbox|xbox360|360)|pc|ps3|wii)\b/i' , $string, $matches);
    $t = isset($matches['XBOX']) ? 'XBOX' : $matches[0];
    

    或在匹配之前预先替换东西:

    $string = preg_replace('~\b(xbox|xbox360|360)\b~', 'XBOX', $string);
    preg_match('/\b(XBOX|pc|ps3|wii)\b/i' , $string, $matches);
    

    在大输入上,我猜你的方法是最快的。一个小的改进是将in_array 替换为基于哈希的查找:

    $x = array('xbox360' => 1,'xbox' => 1,'360' => 1);
    if( preg_match('/\b(xbox360|xbox|360|pc|ps3)\b/i', $s, $m ) ) {
      $t = $m[0];
    }
    if ( isset($x[$t] ) {
      $t = 'XBOX';
    }
    

    命名子模式:参见http://www.php.net/manual/en/regexp.reference.subpatterns.phphttp://php.net/manual/en/function.preg-match-all.php,示例3

    【讨论】:

    • tnx y 非常好,你的正则表达式太棒了! ;) 你能解释一下 (?Pxbox|xbox360|360) 部分吗?
    • tnx 很多,我会的! ;) 我喜欢使用 isset() 而不是 in_array()。
    • 啊,还有一件事......你的第一个添加 '/\b((?Pxbox|xbox360|360)|pc|ps3|wii)\b/i' 是提出问题的人(对于可能有相同需求的人)!
    猜你喜欢
    • 2013-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 2021-02-25
    • 2015-10-26
    相关资源
    最近更新 更多