2010-08-14 53 views
0

我使用PHP 5的preg函數,如果它有所作爲。絕對初學者正則表達式問題

考慮以下正則表達式匹配的常規語言。

([^{}] | {[0-9a-zA-Z_]+})* 

語言由任意數目的字符,由左,右大括號,其中包含一個或多個字母數字字符串或下劃線標記過的特別嵌入式標籤的字符串。例如,下面是在語言的有效字符串:

asdfasdf 1243#$ *#{A_123} ASDF {432U}

然而,在驗證一個字符串與此正則表達式,我?想要獲得這些花括號分隔標籤及其在字符串中的位置的列表。考慮到前面的示例字符串,我想有一個數組告訴我:

A_123: 20; 432U: 32 

這是可能的正則表達式嗎?或者,我應該只用手寫一個函數,而不使用正則表達式來遍歷字符串的每個字符並分析出我需要的數據?

如果這是一個基本問題,請原諒我;我只是在學習!

回答

2

要捕獲偏移量,可以設置PREG_OFFSET_CAPTURE標誌。 http://php.net/manual/en/function.preg-match.php

preg_match ($regex, $subject, $matches, PREG_OFFSET_CAPTURE); 

您可以自己運行以下腳本並查看結果:

$regex = '~({(\w+)})+~'; 
$str = 'asdfasdf 1243#$*#{A_123}asdf?{432U}'; 

preg_match_all($regex, $str, $m, PREG_OFFSET_CAPTURE); 
$tags = $m[1]; 

echo '<pre>'; 
print_r($tags); // prints tags and their offsets 
echo '</pre>'; 

在模式:

  • \w是一個轉義序列等同於下面的字符類: [a-zA-Z0-9_]
  • 圓括號(...)用於分組,它們也創建反向引用。
  • +是一個量詞,意思是「一個或多個」以前的模式

對正則表達式一個很好的資源:http://www.regular-expressions.info

+0

其實偏移量是最重要的組成部分。我只需要獲取一組花括號分隔的標籤。也許我應該重新修改我的問題:我知道如何使用正則表達式來驗證給定的字符串是否屬於給定的常規語言,但我不知道如何將它們用於其他任何事情(例如,從一些字符串中提取一些子字符串字符串,這是我需要在這裏做的) – 2010-08-14 03:37:43

+0

你只需要一個大括號'{}'中的任何內容的列表?查看我的更新回答 – NullUserException 2010-08-14 03:40:37

+0

謝謝! 7654321 – 2010-08-14 04:28:19