2011-08-15 31 views
2

我試圖從正則表達式創建一個字符串。我注意到在Kohana框架的路由系統中,您可以使用類似於正則表達式的東西來設置路由。然後,您可以創建一個與您設置的路線相匹配的網址。我正在嘗試做類似的事情,但我找不到乾淨的方式來做到這一點。我已經例如有以下正則表達式:從正則表達式創建字符串PHP

/^(?<application>\w+)\/(?<controller>\w+)\/(?<method>\w+)\/(?<parameters>\w+)\/?$/ 

現在我希望能夠說,「應用」等於「一個」,「控制」等於「B」,「法」等於「C」和「參數」等於「d」。然後我應該得到一個字符串,用指定的值替換零件。儘管如此,我找不到一個好方法。我基本上想到了兩種方法:1)用指定的值替換正則表達式中的對應值,或2)創建一個自定義的「正則表達式語法」,您可以輕鬆地使用它來創建字符串並將其轉換爲「正確「需要時正則表達式。 Kohana使用後者,但這兩種方式對我來說聽起來都很糟糕。你會如何做到這一點?

編輯:我會盡量澄清一點。我例如下列字符串傳遞給上述使用preg_match()所示的正則表達式:「所有MyApplication/myController的/ myMethod的/ myParameters」。這將返回一個包含幾個項目的數組,其中包括具有相應值的索引「application」,「controller」,「method」和「parameters」的4個項目。現在我必須用正則表達式的模式創建字符串「myApplication/myController/myMethod/myParameters」,而我只有4個項目的數組。我如何使用PHP來做到這一點?

+1

這還不清楚。你能舉一個輸入字符串和相應的輸出字符串的例子嗎? –

+0

我對PHP和正則表達式非常熟悉,但是我不知道你在問什麼。你的問題對我來說毫無意義,我建議你從頭編輯你的問題。但誰知道,也許別人都明白。 – Gerry

+0

@Oli Charlesworth,格里:我知道這很可能很難理解,我自己無法解釋它......我添加了一些文本,希望現在更清楚。 – Frog

回答

2

應該考慮到preg_match命名捕獲組(其中正則表達式,當然,使用; more here)的支持是非常簡單的。

一個例子from PHP documentation

<?php 

$str = 'foobar: 2008'; 

preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches); 

/* This also works in PHP 5.2.2 (PCRE 7.0) and later, however 
* the above form is recommended for backwards compatibility */ 
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches); 

print_r($matches); 

?> 

上面的示例將輸出:

Array 
(
    [0] => foobar: 2008 
    [name] => foobar 
    [1] => foobar 
    [digit] => 2008 
    [2] => 2008 
) 

所以你的情況,則可以使用陣列$matches,例如$matches['application']


編輯:好吧,我沒有完全理解這個問題。

使用正則表達式到生成字符串的一個明顯問題是正則表達式可以匹配無限字符串。例如,/cat\s+rat/符合所有:

cat rat 
cat rat 
cat rat 

但在你的榜樣,沒有什麼是不確定的。

那麼你的願望來定義「安全」或單獨,可生成的語言,正則表達式的一個子集是一個很好的,給定一個狹窄的使用情況。然後,您可以將/\(\?P?<(\w+)>\)/的出現次數替換爲那裏的捕獲組的值。

但由於PHP並沒有真正讓你只需要使用捕獲組的值更換期間訪問變量在一個步驟中,您可能將不得不爲此在多個步驟...例如匹配上述組的所有發生情況,提取命名的組,然後最後(在$matches作爲$match的循環中)從'(?P<' . $match . '>)''(?<' . $match . '>)'$$match(儘管以比它更安全的方式)進行簡單的字符串替換。

+0

感謝您的回答!我明白這一點,這正是我現在正在做的。我想要做的是反向這個操作:我知道什麼(在你的例子中)「名稱」是什麼,「數字」是什麼,現在我想創建一個字符串,對應於正則表達式與我知道的值。例如,我知道「name」等於「test」,「digit」等於「2000」,我的函數應該創建一個字符串「test:2000」。 – Frog

+0

噢......我知道......這有點棘手。編輯反映這... –

+0

$ str =「$ name:$ digit」 – Gerry