使用正则表达式从属性中提取数据

时间:2015-05-07 22:24:25

标签: php regex

我有以下模式:

<tbody>
 <div id="aaa">Music</div>
 Ggfdlkjgfds f$5 j3k 
 <div title="Song title #1"></div>
 Fdjflkdsjfds
 <div title="Song title #2"></div>
</tbody>

我必须提取#34;歌曲#1&#34;和#34;歌曲标题#2&#34;从这个字符串。

到目前为止,我写了这样的话:

(Music)(.*?)(title=\")(.*?)(\")(<\/tbody>)

但它不起作用。我怎么能这样做?

谢谢!

EDIT。这不是HTML,而是从Facebook用户页面加载的源代码部分。这些行之间基本上可以有任何内容,因此我只查找三个关键字:

Music
title="
</tbody>

想要在中间的比赛后找到所有比赛。

2 个答案:

答案 0 :(得分:2)

又一个答案:-P

修改 由于有问题的新信息而更新。

$str = <<<EOS
<tbody>
 <div id="aaa">Music</div>
 Ggfdlkjgfds f$5 j3k
 <div title="Song title #1"></div>
 Fdjflkdsjfds
 <div title="Song title #2"></div>
 Foobarbaz
 <div title="Song title #3"></div>
</tbody>
EOS;

// First find string between "Music" and "</tbody>"
if (preg_match('#\bMusic\b(.*?)</tbody>#s', $str, $r)) {
    // Then get all song titles
    preg_match_all('#.*?(?:title="(.*?)")#s', $r[1], $r);
    print_r($r[1]);
}

输出:

Array
(
    [0] => Song title #1
    [1] => Song title #2
    [2] => Song title #3
)

答案 1 :(得分:0)

不要使用正则表达式来解析HTML,HTML不是常规语言。使用其他工具,例如http://simplehtmldom.sourceforge.net/

有用的帖子在SO:

Why it's not possible to use regex to parse HTML/XML: a formal explanation in layman's terms