繁体   English   中英

带preg_match_all的正则表达式

[英]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';

详细信息: http : //www.regular-expressions.info/repeat.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM