2011-05-13 5 views
1

everyone。 你能給我一些關於如何在1中加入以下3個正則表達式的建議嗎?加入3個正則表達式1

preg_match_all('/>\s*([\w-]+)\s*</', $str, $matches_1); 
preg_match_all('/<\?=\s*([\w-]+)\s*\?>/', $str, $matches_2); 
preg_match_all('/echo\s*["|']+\s*([\w-]+)["|']+/', $str, $matches_3); 

UPDATE

preg_match_all(
    '/ 
     >\s*([\w-]+)\s*< 
     | 
     <\?=\s*([\w-]+)\s*\?> 
     | 
     echo\s*("|')+\s*([\w-]+)("|')+ 
    /x', 
    $str, $matches_123); 

對我來說,語法,如果寫在一行,並移除X-修改以上纔有效。出於某種原因,不這樣做的原因:

警告:preg_match_all()[function.preg匹配-所有]:編譯失敗:丟失),偏移量125 ...

我已經解決了它只是在3個字符串中拆分正則表達式並將它們連接起來,但它是一團糟。

+1

有一個問題:它工作嗎?如果是這樣,爲什麼修理沒有損壞的東西? – mellamokb 2011-05-13 15:04:58

+1

@mellamokb它的工作原理。但是,考慮你有一個非常大的字符串,你需要應用正則表達式。有了上面的代碼,你需要解析這個大字符串三次,我認爲這不是一個好習慣。 – noname 2011-05-13 19:14:12

+0

正如@AlanMoore在下面寫的那樣,這個特殊的3行/ x正則表達式只能和每個'#'都轉義成'\#'一起使用。但是,當然,再次壓縮它的效果是一樣的。 – mario 2011-05-15 15:28:35

回答

1

使用|

preg_match_all(
    '/ 
     >\s*([\w-]+)\s*< 
     | 
     <\?=\s*([\w-]+)\s*\?> 
     | 
     echo\s*("|&\#039;)+\s*([\w-]+)("|&\#039;)+ 
    /x', 
    $str, $matches_123); 

你可能想每個部分封裝成(括號),讓他們在結果列表分開加入他們作爲替代品。但是其他子表達式可能需要是前綴?:["|']也是無效的(方括號不以這種方式工作,可能會意外運行,但不是可靠的匹配)。

+0

謝謝,但在我的情況下,方括號確實按我需要的方式工作。你也應該在結束報價前加上'x'。 – noname 2011-05-13 19:28:19

+0

@noname所以最後一個正則表達式真的應該匹配'echo&; abc |#' - 因爲這就是你的角色類所做的。 – mario 2011-05-13 20:56:30

+0

是的,你說得對,它是無效的。我遵循你的建議。看到我的問題更新,PLZ。 – noname 2011-05-15 13:44:45

1

取決於你加入的意思...你的意思是「匹配這個,否則那個,否則最後一個」?如果是這樣的話:

/>\s*([\w-]+)\s*<|<\?=\s*([\w-]+)\s*\?>|echo\s*(?:"|')+\s*([\w-]+)(?:"|')+/ 
+0

謝謝,工作正如預期的那樣 – noname 2011-05-13 19:11:20

+1

您需要更改'[" | '] ''到'(?:" | ')';這是原始正則表達式中的錯誤 – 2011-05-15 14:19:45

+0

@Alan:的確,我沒有注意到它 - 謝謝! – 2011-05-15 14:55:08