2014-04-16 61 views
0

目前,我有以下代碼,它用於執行模式匹配&模式替換。如何通過僅使用preg_replace來檢查模式是否匹配

<?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_replace之前執行preg_match。我覺得這是多餘的。

我試圖從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

什麼是你想實現你的功能?如果你總是希望這個字符串是「EAT pizza」,那麼只要preg_match爲true就設置它。 – karlingen

回答

3

我假設你真正要求的是知道如何知道你的preg_replace中是否有任何替代品,因爲它很不清楚你實際上想要達到什麼。

從PHP文檔上preg-replace

說明

混合的preg_replace(混合$圖案,混合$替換,混合$主題[摘要$極限= -1 [摘要& $計數]])

[..]

計數

如果指定,則此變量將填充完成的替換次數。

因此,如果你添加一個計數您的preg_replace,你會得到更換的次數,從而出現的次數。

實例給出(你這是種變成了藍色,由於缺乏信息):

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>,或者,如果沒有那些在那裏發現的,它將嘗試用EAT替換ATEEAT

+0

@ Jonny5:這仍然需要兩個正則表達式語句,因此不能保存任何防止冗餘性能的權利?我可能可以寫一個例子,但我沒有這樣做的唯一原因是因爲這個問題沒有提供關於函數實際上應該做什麼的信息。給定輸入示例沒有定義的期望輸出。 –

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; 
} 
相關問題