2011-09-05 75 views
0

以下是我正在使用的正則表達式的簡化。在我的開發機器上,$pattern1$pattern2返回一個匹配,但是在我的生產機器上只有$pattern1返回一個匹配!顯然,$pattern1$pattern2之間的唯一區別在於其中一個括號圍繞單詞。然而兩者都是有效的模式,應該匹配給定的乾草堆(據我所知)。當添加括號時,preg_match失敗

$pattern1 = '/\<a name="ERROR TEXT"\>\<\/a\>\s*?validated\s*?\<\/span\>\s*?\<\/h1\>/'; 
$pattern2 = '/\<a name="ERROR TEXT"\>\<\/a\>\s*?(validated)\s*?\<\/span\>\s*?\<\/h1\>/'; 
$haystack = '- IFCS msg value, BOOKMARKED AS ERROR TEXT --> 
      <a name="ERROR TEXT"></a> 
      validated</span> 
     </h1> 

       <!-- START: .formActionHolder --> 
       <div class="formActionHolder">'; 
preg_match($pattern1, $haystack, $matches); 
print_r($matches); 

有沒有人發現過這個問題?請注意,這不是整個正則表達式 - 這是我認定爲問題的簡化版本。在我的實際代碼中,'驗證'的值不是一個常量 - 因此我使用括號來捕獲單詞的原因。當然模式在括號內也有其他字符,所以我可以在這裏捕捉變量詞。這只是一個簡化的例子,它解決了我有兩個看起來很好的正則表達式的問題。

在我的開發機器上我使用php5.3.2與pcre 7.8庫和我的生產機器上我使用php5.2.4與pcre 7.4。

+0

轉義括號:'(validated)' - >'\(validated \)' – nobody

+0

爲什麼?乾草堆裏沒有括號。我想捕獲單詞'驗證',因爲它不是一個常數 – mulllhausen

+1

您是否在兩臺機器上測試上面的確切隔離代碼? – nobody

回答

0

我有一個想法有關$pattern2?(組合,所以我除去?使

$pattern = '/\<a name="ERROR TEXT"\>\<\/a\>\s*(validated)\s*?\<\/span\>\s*?\<\/h1\>/'; 

而且工作!它非常奇怪 - 甚至可能是一個錯誤?

,所以它看起來像?(validated)位被解釋爲有條件的子模式,而不是問號被用來使\s* ungreedy

並不像正確的行爲給我。

啊好吧...它有點痛,因爲現在我的*會貪婪。正則表達式模式做我想在這種情況下,雖然...

感謝您的所有有用的意見!

0

括號用於在php正則表達式中進行分組,並且除非您將它們轉義以使它們充當字符本身,否則就是這樣做的。

+0

我認爲這一點 - 它們應該匹配,因爲沒有'( )主題字符串中的字符。事實上,他們兩個匹配[RegExr](http://gskinner.com/RegExr/)... – DaveRandom

+0

我知道。我想捕獲單詞「驗證」,因爲它不是一個常數 – mulllhausen

+0

@mulllhausen如果它不是常量,那麼如果正則表達式不具有任何非「驗證」的值,它將不匹配。你可能會更好地使用[DOM解析器](http://php.net/manual/en/book.dom.php)來完成這項工作嗎? – DaveRandom

0

你確定$ pattern2 coundn't匹配?在我的蝕,它匹配,顯示 陣列([0] =>驗證 [1] =>驗證)

+0

是的,我知道!它在運行php5.3.2的開發機器上也能正常工作。 – mulllhausen

+0

@mulllhausen我無法在PHP/5.2.9-2 Win32或PHP/5.2.17上重複此操作Win32 - 有沒有什麼方法可以在生產機器上升級PHP?它看起來像這樣可能是5.2.4中的某種奇怪的錯誤 – DaveRandom

+0

@DaveRandom - php升級將是理想的,實際上這是我的第一個想法。但看着它,我意識到我可能需要做一個系統的克隆來測試升級,這將是很多工作:(它真的很煩人,dev和prod機器不使用相同版本的東西! – mulllhausen