簡體   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