描述
这个正则表达式将
- 匹配第一个锚标签,
<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