2010-12-03 116 views
2

我試圖從各種字符串中提取匹配特定模式的單詞。從字符串獲取單詞 - PHP

字符串的長度和內容各不相同。

例如:

我想提取與江淮汽車開始從以下字符串的所有文字和填充完整單詞的數組:

  • 我昨天買了一件夾克。
  • 傑克回家了。
  • 我想去傑克遜維爾。

結果數組應該是[外套,傑克,傑克遜]

我一直在嘗試使用的preg_match(),但由於某種原因,它不會工作。有什麼建議麼???

$q = "jac"; 
$str = "jacket"; 
preg_match($q,$str,$matches); 

print $matches[1]; 

這將返回空值:S。我不知道問題是什麼。

+1

顯示您現有的代碼:-) – Erik 2010-12-03 03:41:11

+0

特別是你試圖使用的正則表達式! – GWW 2010-12-03 03:43:12

回答

4

您可以使用preg_match爲:

preg_match("/\b(jac.+?)\b/i", $string, $matches); 

See it

1

你得read the manual幾百次,它最終會來找你。

否則,你要抓住什麼可以表示爲「尋找‘JAC’後跟0或多個字母*,並確保它不是由一個字母開頭」它給你:/(?<!\\w)(jac\\w*)/i

這裏的與preg_match_all()一個例子,讓你可以捕捉所有的模式的出現次數,不只是第一:

$q = "/(?<!\\w)(jac\\w*)/i"; 
$str = "I bought a jacket yesterday. 
Jack is going home. 
I want to go to Jacksonville."; 

preg_match_all($q,$str,$matches); 

print_r($matches[1]); 
  • 注:由「信」我的意思是任何「單詞字符」。它正式包含數字和其他「單詞字符」。根據確切的情況,一個可能更喜歡\ W(字字符)或\ B(字邊界)

您可以通過使用一個character class包括額外的字符。例如,爲了匹配任何單詞字符以及單引號,您可以使用[\w']和你的正則表達式變成:

$q = "/(?<!\\w)(jac[\\w']*)/i"; 

或者,你可以添加一個可選's到您現有的模式,讓你捕捉「江淮」後跟任意數量的單詞字符隨後任選地「的」

$q = "/(?<!\\w)(jac\\w*(?:'s)?)/i"; 

這裏,括號內的?:意味着你實際上並不需要捕捉的內容(因爲他們已經內一對括號,這是沒有必要的),並在?之後括號表示匹配是可選的。