2013-07-19 51 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