2012-03-01 29 views
0

我想在preg_match_all的模式中包含变量。我已经尝试了几种方法,而且它们都不起作用 - 即使这种模式在回声上是正确的。如何在php中使用preg_match_all中的变量失败?

这是我有:

第一次尝试(使用单引号是安全的):

$pattern_areacode = '/\<a name\=\"'. $code . '\"\>'. $code . '\<\/a\>.*?(\<td\b[^>]*\>  (.*?)\<\/td\>).*?<\/tr\>/'; 
    preg_match_all($pattern_areacode, $contents, $ac_match); 

问题:我打印的模式,它看起来很好。然而它并没有返回任何结果。

第二次尝试(使用双):

$pattern_areacode = "/\<a name\=\"$code\"\>$code\<\/a\>.*?(\<td\b[^>]*\>(.*?)\<\/td\>).*?<\/tr\>/"; 
    preg_match_all($pattern_areacode, $contents, $ac_match); 

问题:双引号前$得到逃脱。奇怪的。

我做了我的研究,并尝试了其他一些方法,包括使用大括号{},但无济于事。

我如何得到这个工作?

谢谢!

+1

另请参见[你能提供一些例子为什么很难用正则表达式分析XML和HTML?](http://stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why-it-is-hard-to-parse -xml-and-html-with-a-reg) – deceze 2012-03-01 01:44:52

+2

“它看起来很好”。它显然不是很好。否则会起作用。 – 2012-03-01 01:44:55

+1

看起来你有点过分偏执,你的逃跑在那里。我不认为你需要转义'<或'='。如果您可以给我们提供'$ code'和'$ contents'的示例值,那么我们可以更容易地提供帮助。 – 2012-03-01 01:45:24

回答

2

确保您的输入已被转义,并且不包含正则表达式可能会解释为模式的任何内容(这可能会导致匹配失败)。这可以使用preg_quote轻松完成。所以,如果你还没有:

$code = preg_quote($quote); 

另外,我建议使用一个实际的HTML解析器,而不是正则表达式匹配,也许看在使用DOMDocument

+0

参数是一个3位整数,所以我不认为转义是必要的 – alan 2012-03-01 03:28:58