匹配链接和文本之间的标题(如果存在于PHP中)

时间:2013-11-11 05:57:43

标签: php regex preg-match-all

我正在尝试匹配存在时的可选链接/标题,如果没有链接只是匹配标记内的文本。

表示例:

$html_data = <<<HTML
    <table>
     <tr> <td> Some text here </td> </tr>
     <tr> <td> Some text with link <a href="http://domain1.com/">Link Title 1</a> </td> </tr>
     <tr> <td> Some text here without link </td> </tr>
     <tr> <td> Some text with link <a href="http://domain2.com/">Link Title 2</a> and more text </td> </tr>
    </table>
HTML;

代码示例:

preg_match_all('~<tr> <td> (?:<a href="(.*?)">(.*?)</a>)? (.*?) </td> </tr>~i', $html_data, $result);

所以我需要抓取纯文本和链接+标题(如果存在)并将其放入数组中。

这样的东西,当链接存在时;

'text_before' => 'Some text with link'
'link_href' => 'http://domain2.com/'
'link_title => 'Link Title 2'
'text_after' => 'and more text'

如果没有链接,只需匹配“td”标记之间的可用文字。

这样的东西,当没有链接时;

'text' => 'Some text here without link'

1 个答案:

答案 0 :(得分:2)

我会从一开始就采取一些措施:

  1. <td.*?<\/td>因为您需要包含要评估的代码的行,然后:
  2. <a.*?>(.*?)<\/a>因为您需要链接的标题,然后:
  3. href=\"(.*?)\"因为您需要一个链接,然后:
  4. <td>(.*?)<因为您需要一个文本,即使内部没有链接,并且:
  5. <\/a>(.*?)<最后。
  6. 希望它有所帮助。 欢呼声。

    编辑: 一个正则表达式<td.*?>(.*?)(<a.*?href=\"(.*?)\".*?>(.*?)</a>)?(.*?)</td>