2013-04-06 72 views
1

我是初學PHP的人。我正在嘗試使用正則表達式的各種組合。我指的是thisthis並嘗試使用this的示例。PHP正則表達式示例

我的疑惑:

  1. 爲什麼preg_match_all('((a|b)*c)', 'ababc', $arr, PREG_PATTERN_ORDER);既提供ababaca作爲輸出。它不應該只是ababac

  2. 假設我正在嘗試讀取$arr中的所有可能的輸出,我該怎麼做,而不必回顯數組中的每個元素?目前,我正在使用foreach來迭代$arr中的元素。這是對的嗎?有沒有更好的方法來做到這一點?

  3. 爲什麼preg_match_all()得到具有元件$arr[$i][0]和在某些情況下,其中$arr[0][$i]$i沒有可能的匹配的2D陣列。有沒有辦法知道如何存儲輸出?

對不起,在一篇文章中發佈太多問題。請告訴我,如果我需要改變它。

+1

讓我們從第一個開始:你可以把'var_dump($ arr)'我們看到它給出了什麼? – 2013-04-06 23:26:16

+0

echo var_dump($ arr); (1){[0] => array(2){[0] => string(6)「ababac」[1] => string(1)「a」}} – 2013-04-06 23:30:27

回答

3
  1. (a|b)是一個捕獲的子模式,因此它被作爲結果返回陣列的一部分。你可以通過使用(?:a|b)來使它不被捕捉,但是它會比角色類[ab]好得多。

  2. foreach可能是最好的辦法。

  3. 如1所述,你將得到你的子模式捕獲並返回到數組中。

你可能想看看preg_replace_callback(),因爲這將適用於一個給定的回調(通常是匿名函數),以每場比賽。

+0

對不起, :部分。這是什麼意思?我知道 ?意味着0或一個字符。 – 2013-04-06 23:32:20

+0

@PRamesh:非捕獲組。你不需要在'()'中獲取與模式相匹配的文本,你只需要分組屬性,所以非捕獲組「(?:pattern)」就是你想要的。 – nhahtdh 2013-04-06 23:44:40

+0

*「我知道?意思是0或一個字符」*這就像說:「我知道'我'意思是」我「,那麼」in「是什麼意思? – 2013-04-06 23:46:01