PHP,preg_match,正则表达式。我究竟做错了什么?

时间:2009-11-13 00:54:10

标签: php regex preg-match

这是我想要匹配的模式:

<div class="class">
<a href="http://www.example.com/something"> I want to be able to capture this text</a>
<span class="ptBrand">

这就是我在做的事情:

$pattern='{<div class="productTitle">[\n]<((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)>([^\n]*)</a>[\n]<span class="ptBrand">}';

preg_match($pattern, $data, $matches,PREG_OFFSET_CAPTURE);

print_r($matches);

打印:

Array()

4 个答案:

答案 0 :(得分:5)

作为一般规则,正则表达式是解析HTML的一种非常糟糕的方法。它们不可靠,往往最终变得非常复杂。更强大的解决方案是使用HTML解析器。请参阅Parse HTML With PHP And DOM

至于你的表达方式,我在源代码中的任何地方都看不到<div class="productTitle",所以我从那里开始。同样地,你试图解析一个URL,但没有提到锚标记(直接或通过足够的通配符),所以它也会在那里失败。基本上,表达式看起来与您尝试解析的HTML不同。

答案 1 :(得分:1)

......或者这个:

preg_match('/\s*([^>]+)\s*<\/a/',$string,$match);

修剪它。

答案 2 :(得分:0)

模式:

/<div class="class">\s*<a href=\"([^"]+)\">([^<]+)</a>/m

粗略地获取链接和文本,但使用DOM库将是一个更好的方法。

答案 3 :(得分:0)

你可以试试这个:

<a href=".*?">([\s\S]*?)</a>