[英]Regular expression with preg_match_all
使用正则表达式时出现问题:
php> $html = "<html><head><body><h1>hello world</h1><img src=\"data:rawIMGdata\" /><p/><img src=\"sdfsdf.jpg\" title=\"pic1\" /><p/><div class=\"myclass\"><img src=\"data:imageData\" /></div><img alt=\"bla\" src=\"bla.jpg\" title=\"bla\" /></body></html>";
php> $pat = '/<img.*src="(data:.*)"/m';
php> preg_match_all($pat, $html, $matching);
php> var_dump($matching);
array(2) {
[0]=>
array(1) {
[0]=>
string(169) "<img src="data:rawIMGdata" /><p/><img src="sdfsdf.jpg" title="pic1" /><p/><div class="myclass"><img src="data:imageData" /></div><img alt="bla" src="bla.jpg" title="bla""
}
[1]=>
array(1) {
[0]=>
string(63) "data:imageData" /></div><img alt="bla" src="bla.jpg" title="bla"
}
}
我的预期输出将只是第二个数组中“ data:imageData”的出现,而且应该有两个匹配项(“ data:rawIMGdata”)
我定义正则表达式的方式有误吗?
问候,Broncko
您可能要考虑使用DOM Document来解析HTML,尽管如果此示例很复杂,那么您可能可以不用正则表达式了。 DOM文档将始终更加强大。
尝试这个:
/<img.*?src="(data:[^"]*)"/m
? 将*设置为非贪婪(因此它将获得最小匹配项,默认情况下会尽可能多地捕获)
除了匹配任何内容外,您还可以将所有非“与[^”]匹配。
之前的。*很贪婪,并且与另一个元素中的“
您基本上是在告诉PCRE捕获太多信息。 正则表达式匹配运算符将尽可能地匹配,这就是为什么您在匹配中获得大量额外内容的原因。 首先,切换到使用非贪婪变体来匹配初始空白和/或匹配元素的内容。 其次,引入适当的定界符以匹配属性内容的结尾。 这是您应该使用的模式:
$pat = '/<img.*?src="(data:[^"]*)"/m';
如果您尝试解析有效(几乎有效)的HTML,则可以尝试使用仅用于解析XML的工具(如DOM
,该工具可以使您非常有效地浏览XML。
正则表达式肯定会做的工作,但一旦你换'
为"
从或HTML变化<img src="">
到<img class="" src="">
您可能会出现问题。
XML解析实用程序通常也要注意转义和“取消转义”参数,处理重复的参数。
例如,使用DOMxPath
(此处为[tutorial] ):
$doc = new DOMDocument;
$doc->Load('book.xml');
$xpath = new DOMXPath($doc);
$query = '//img';
$entries = $xpath->query($query);
foreach ($entries as $entry) {
if( !$entry->hasElement('src')){
continue;
}
$src = $entry->getAttribute( 'src');
if( strncmp( $src, 'data:', 5) != 0){
continue;
}
$content = substr( $src, 5);
// Do whatever you need
}
尝试使用“惰性”表达式-
$pat = '/<img(.*?)src="(data:.*)"/m';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.