[英]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.