Php 使用正则表达式从属性中提取数据
我有以下模式:Php 使用正则表达式从属性中提取数据,php,regex,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> 音乐 Ggfdlkjgfds 5 j3k美元 Fdjflkdsjfds 我必须从这
<tbody>
<div id="aaa">Music</div>
Ggfdlkjgfds f$5 j3k
<div title="Song title #1"></div>
Fdjflkdsjfds
<div title="Song title #2"></div>
</tbody>
音乐
Ggfdlkjgfds 5 j3k美元
Fdjflkdsjfds
我必须从这个字符串中提取“歌曲标题#1”和“歌曲标题#2”
到目前为止,我写了这样的东西:
(Music)(.*?)(title=\")(.*?)(\")(<\/tbody>)
(音乐)(.*)(标题=\”)(.*)(\”)
但它不起作用。我该怎么做
谢谢
编辑。这不是HTML,而是源代码的一部分,从facebook用户页面加载。这些行之间基本上可以有任何内容,因此我只查找三个关键字:
Music
title="
</tbody>
音乐
标题=”
并希望在中间一个之后找到所有匹配项。不要使用正则表达式来解析HTML,HTML不是一种正则语言。请使用其他工具,如 在此处发布有用的帖子,以便: 还有一个答案:-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]);
}
我认为你不需要逃避正斜杠。你还写了tbody而不是div。将DOMDocument与DOMXPath一起使用。我必须处理数千个请求,这太慢了。这是来自facebook的。幸好他当时没有解析html,他只是想从文本块中提取一个值。顺便说一句,使用正则表达式可能不太好是的,但不是出于理论原因(仔细阅读链接问题下的注释)。HTML不是常规语言这一事实是错误的。主要问题是,当你看到结构化语言时,当使用的语言(php)时,没有真正的理由使用文本方法有libxml的内置实现。关于simplehtmldom,我认为这个lib没有用,速度慢,也不那么简单(我建议您看看代码)。
Array
(
[0] => Song title #1
[1] => Song title #2
[2] => Song title #3
)