php
  • regex
  • preg-match
  • 2009-11-13 39 views 0 likes 
    0

    这里是我想匹配的模式:PHP,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); 
    

    它打印:

    阵列()

    回答

    5

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

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

    +0

    是不是划定它。 – manny 2009-11-13 00:58:40

    0

    模式:

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

    会得到链接和文字粗略,但使用DOM库会是一个更好的方法。

    0

    你可以试试这个:

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

    ...或者这样:

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

    修剪它。

    相关问题