1
<a href="http://newday.com/song.mp3">First Link</a>
<div id="right_song"> 
        <div style="font-size:15px;"><b>Pitbull ft. Chris Brown - Pitbull feat. Chris Brown - International Love mp3</b></div> 
        <div style="clear:both;"></div> 
<div style="float:left;"> 
    <div style="float:left; height:27px; font-size:13px; padding-top:2px;"> 
        <div style="float:left;"> 
    <a href="http://secondurl.com/thisoneshouldonlyoutput" rel="nofollow" target="_blank" style="color:green;">Second Link</a></div>'; 

我想使用 pregmatch_all 从此 html 中获取第二个链接。我当前的正则表达式如下所示:

preg_match_all("/\<a.+?href=(\"|')(?!javascript:|#)(.+?)\.mp3(\"|')/i", $html, $urlMatches);

这工作正常,我得到两个链接输出,但我只希望输出第二个没有 .mp3 扩展名的链接。请帮我

4

1 回答 1

0

描述

这个正则表达式将

  • 匹配第一个锚标签,<div id="rigth_song">其后有一个 href 属性,其值以.mp3
  • 将避免许多使 html 文本与正则表达式匹配非常困难的边缘情况。

<div\sid="right_song">.*?<a(?=\s|>)(?=(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*?\shref=(['"]?)(.*?\.mp3)\1(?:\s|\/>|>))(?:[^>=]|='[^']*'|="[^"]*"|=[^'"][^\s>]*)*>.*?<\/a>

在此处输入图像描述

例子

示例文本

请注意第二个锚标记中的困难边缘情况,例如字符串href="bad.mp3"嵌套在属性值中;值内有一个大于符号的javascript >;真正的 href 属性是不带引号的。

<a href="http://newday.com/song.mp3">First Link</a>
<div id="right_song"> 
        <div style="font-size:15px;"><b>Pitbull ft. Chris Brown - Pitbull feat. Chris Brown - International Love mp3</b></div> 
        <div style="clear:both;"></div> 
<div style="float:left;"> 
    <div style="float:left; height:27px; font-size:13px; padding-top:2px;"> 
        <div style="float:left;"> 
<a onmouseover=' href="bad.mp3" ; if ( 6 > x ) {funRotate(href); } ; ' href="http://secondurl.com/thisoneshouldonlyoutput.mp3">First Link</a>
</div>

代码

<?php
$sourcestring="your source string";
preg_match('/<div\sid="right_song">.*?<a(?=\s|>)(?=(?:[^>=]|=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*)*?\shref=([\'"]?)(.*?\.mp3)\1(?:\s|\/>|>))(?:[^>=]|=\'[^\']*\'|="[^"]*"|=[^\'"][^\s>]*)*>.*?<\/a>
/imsx',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>

匹配

第 0 组获取从 到 的文本,<div包括完整匹配的锚标记
第 1 组获取后面引用的 href 值周围的开始引号
第 2 组获取 href 值

[0] => <div id="right_song"> 
        <div style="font-size:15px;"><b>Pitbull ft. Chris Brown - Pitbull feat. Chris Brown - International Love mp3</b></div> 
        <div style="clear:both;"></div> 
<div style="float:left;"> 
    <div style="float:left; height:27px; font-size:13px; padding-top:2px;"> 
        <div style="float:left;"> 
<a onmouseover=' href="bad.mp3" ; if ( 6 > x ) {funRotate(href); } ; ' href="http://secondurl.com/thisoneshouldonlyoutput.mp3">First Link</a>
[1] => "
[2] => http://secondurl.com/thisoneshouldonlyoutput.mp3
于 2013-07-22T03:42:28.370 回答