2009-02-19 63 views
0

這是一個比PHP特定的更通用的正則表達式問題。正則表達式解析PHP中的自定義字符串語法

我給予不同的字符串可能看起來像:

A/B/PA ID U/C/D

而且我試圖提取中間斜線段有空間(「/ PA ID U」 ),使用:

preg_match('/(\/PA .+)(\/.+|$)/', '', $matches);

然而,我並沒有像我期待的那樣得到「/ PA ID U」,而是得到了「/ PA ID U/C/D」。

如何在「最後一組」中將「/.+」與「$」匹配的優先次序?


其他注意事項:

我需要的最後一組要匹配另一個「/ somethingsomthing」或「」,因爲該字符串變化很大。如果我只匹配「/.+」,如果它在行尾,例如「A/B/PA ID U」中,我將無法獲得「/ PA ID U」。

基本上,我需要能夠提取特定部分,像這樣:

鑑於:"A/B/PA ID U/PA ID U/C/D"

提取物:(A), (B), (PA ID U), (PA ID U), (C), (D)


[UPDATE]

我試圖避免使用split()或爆炸(),因爲這意味着我必須分別匹配「PA ID U」模式。除了僅提取斜線分隔的段,我需要驗證子字符串是否匹配特定的模式。

回答

1

你的正則表達式是行不通的,因爲.+是貪婪。你可以通過添加非貪婪修飾符(一?)你的第一個.+這樣解決這個問題:

preg_match('/(\/PA .+?)(\/.+|$)/', '', $matches); 

你可以交替做:

'/\/(PA [^\/]+)(\/.+|$)/' 

我感動的斜線括號以外的避免捕捉(我認爲你對斜線不感興趣)。 [^\/]+將捕獲到下一個斜槓的任何字符。

+0

正是我需要的!謝謝! :D 我還在http://www.regular-expressions.info/repeat.html – 2009-02-19 07:58:28

2

我認爲你可以最有效地使用split來完成你想要的。

split('/',$string); 

參見:php manual

0

necramirez,

(\w+\s?)+ 

應該工作

相關問題