如何仅使用preg_replace检查模式是否匹配

时间:2014-04-16 09:27:17

标签: php regex

目前,我有以下代码,用于执行模式匹配&模式替换。

<?php

function fun($text) {
    if (preg_match("/^(ATE|EAT)\s+(\S+).*/", $text)) {
        $text = preg_replace("/^(ATE|EAT)\s+(\S+).*/", "EAT $2", $text);
    } else {
        $text = preg_replace("/.*(ATE|EAT).*/", "EAT", $text);
    }
    return $text;
}

// EAT pizza
echo fun('EAT pizza') . "\n";

// EAT pizza
echo fun('EAT pizza at paris') . "\n";

// EAT
echo fun('I EAT pizza at paris') . "\n";

我觉得上面的代码没有优化,因为我在preg_match之前正在执行preg_replace。我觉得这是多余的。

我尝试检查preg_replace

中返回的字符串
<?php

function fun($text) {
    $tmp = preg_replace("/^(ATE|EAT)\s+(\S+).*/", "EAT $2", $text);
    // I don't think this is the correct way to check for "Not Match" ?!
    if ($tmp === $text) {
        $tmp = preg_replace("/.*(ATE|EAT).*/", "EAT", $text);
    }
    return $tmp;
}

// EAT pizza
echo fun('EAT pizza') . "\n";

// EAT pizza
echo fun('EAT pizza at paris') . "\n";

// EAT
echo fun('I EAT pizza at paris') . "\n";

但是,fun('EAT pizza')会失败,因为它会打印出EAT而不是预期的EAT pizza

是否有正确的方法来优化上述代码?

2 个答案:

答案 0 :(得分:3)

我认为你实际要求的是知道如何知道你的preg_replace中是否有任何替换,因为你不清楚你真正想要实现的目标。

来自preg-replace上的PHP文档:

  

<强>描述

     

混合preg_replace(混合$ pattern,混合$替换,混合$ subject [,int $ limit = -1 [,int&amp; $ count]])

     

[..]

     

<强>计数

     

如果指定,则此变量将填充已完成的替换次数。

因此,如果您向preg_replace添加 count ,您将获得替换次数,从而获得出现次数。

给出的例子(由于缺乏信息,这是一种蓝色):

function fun($text) {
  $count = 0;
  $tmp = preg_replace("/^(ATE|EAT)\s+(\S+).*/", "EAT $2", $text, -1, $count);
  if ($count == 0) {
        $tmp = preg_replace("/.*(ATE|EAT).*/", "EAT", $text);
  }
  return $tmp;
}

因此,这会将ATE <something>EAT <something>替换为EAT <something>,或者,如果找不到,则会尝试替换ATEEATEAT

答案 1 :(得分:0)

尝试使用以下功能:

function fun($text) {
    $tmp = str_replace('ATE', 'EAT', $text);
    $pos = strpos($text, 'EAT');

    if ($pos < 0) {
        return $text;
    } else if ($pos > 0) {
        $tmp = preg_replace('/^.*?EAT/', 'EAT', $tmp);
    }

    $tmp = preg_replace("/^EAT\s+(\S+).*/", "EAT $2", $tmp);

    return $tmp;
}