2013-07-19 49 views
0

我有下面這段代碼的工作:(A標準文本字符串)正則表達式來捕捉引號之間串

($txid) = $content =~ m/ start (.*) stop /; 
print $txid; 

而下面的一段代碼,不會:(帶引號的字符串)

($txid) = $content =~ m/<input name="transactionid" value="(.*)" type="hidden">/; 
print $txid; 

我猜測問題是由引號造成的。有誰知道我能如何解決這個問題?

+0

該問題是非常可能*不*帶引號。 (a)不要用正則表達式解析HTML,這勢必造成脆弱的解決方案。 (b)你有什麼投入?向我們展示一個例子。 – amon

+0

['「不工作」](http://tlp-perl.blogspot.se/2013/06/its-not-working.html)不是描述問題的好方法。 – TLP

+0

這裏輸入的方式很大,它是HTML的網頁。第一個我剛剛做了一個字符串「開始你好停止」,它正確地返回「你好」。第二個只是返回一個空變量。我已經檢查過,$內容填充了正確的數據,我只需要獲取隱藏字段「transactionid」的值。 – user1796225

回答

0

默認情況下,*量詞是「貪婪」,這意味着(.*)將匹配它可能的所有內容。要限制它,使得它匹配儘可能少,即,僅直到發生的串中的下一個雙引號,添加一個?到它,因此:

($txid) = $content =~ m/<input name="transactionid" value="(.*?)" type="hidden">/; 

假設value屬性的值不包含逃脫雙引號,這會產生你後面的結果。

(當然,在那裏逃脫雙引號的情況下,沒有正則表達式,這將可靠地提取的利益,沒有別的只是字符串。這就是爲什麼人們告訴你不要使用正則表達式作爲你的唯一工具另一方面,鑑於你的目的很簡單,你可能會忽略它 - 但對於任何事情,我的意思是任何東西,這需要HTML或XML處理,甚至更復雜比這個,使用XML解析器。)

+0

感謝這工作。 – user1796225

+0

@ user1796225很高興爲您服務。也就是說,關於使用正則表達式解析HTML的警告是多年累月的詛咒,拉扯頭髮和普遍痛苦的結果,並且您會非常好地遵守它們。你只是在這裏逃避,因爲你有一個非常簡單的問題;如果你的需求更加複雜,我會給你一個HTML :: TreeBuilder的例子。當然,歡迎您忽略這一建議,但是您會冒這種危險。 –

+0

沒問題,我很欣賞你的建議。就像你說的那樣,這是一個簡單的任務,而且這是我唯一需要在整個軟件中解析HTML的時候。在將來如果我每解析HTML,我都會記住這個建議。 :-) – user1796225