2015-12-14 49 views
-6

假設我有一個包含一些文本的變量,包括正常HTML標記中的URL。特別是,我對標籤的src =元素感興趣。比方說,我知道我想在這一堆文本中搜索的確切src =字符串,我想用其他一些文本替換它。 。 。這裏是一些什麼我已經試過(僞代碼):如何使用Perl在html中搜索和替換特定的src =「url」標記?

所有的
my $bunchotxt = << 'END_MESSAGE'; 
<a href="http://link.com/image.gif"><img class="alignleft size-thumbnail wp-image-295" src="http://link.com/image.gif" alt="shredding" width="150" height="150" /></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis convallis fringilla dui eget cursus. Nullam in mauris viverra elit pharetra fringilla. Pellentesque gravida ligula sit amet magna blandit, semper luctus enim semper. Nam a sem ut ex aliquam consectetur. Nulla enim metus, porta at elementum non, facilisis ullamcorper nisl. Vestibulum sed iaculis ante. Nullam mollis luctus posuere. 

Suspendisse ipsum odio, iaculis in malesuada id, varius 
END_MESSAGE 

my $parser = HTML::TokeParser::Simple->new(
    string => $bunchotxt 
); 

while (my $tag = $parser->get_tag('img')) { 
    #print $tag->as_is, "\n"; 
    for my $attr (qw(src)) { 
     $replaceStr = sprintf qq{%s="%s"\n}, $attr, $tag->get_attr($attr); 
     $parsedtag =~ s/"//g; 
     my @bits = $url->path_segments(); 
     $cidreplace{$unparsedtag} = $path; 
    } 
    my $replaceStr = "src:\"replaced\""; 
    $bunchotxt =~ s/$findURL/$replaceStr/g; 
    print "$buchotxt\n"; 
} 
+0

然後你只需要你想匹配的字符串相匹配。你忽略了原始文件中的'''字符 – Quentin

+0

你在搜索模式中的第一個雙引號出現在錯誤的地方,並且你不需要轉義'='或':',但是你需要轉義''.'在這種情況下,因爲你想匹配一個字面點。 –

+0

男人,我希望我可以重新發布這個問題的方式,它真的應該被問到。在代碼中我試圖去工作,$ findstr字符用另一個使用HTML :: Tokeparser :: Simple的循環來填充來自原始文本的所有src =元素的列表,因此$ findstr最終具有從代碼的Tokeparser部分返回的值的值。我已經試着用quotemeta()逃脫了,但是這似乎沒有什麼區別,希望你願意再次明白這一點。 – 2crd3o

回答

0

首先,我們需要提煉您的問題到我們真正關心的部分。你的示例代碼不是很好,因爲它包含了很多不相關的錯誤,所以我已經採取了一些自由度來剝離我認爲解決問題絕對不必要的東西。我還爲您的HTML添加了一些換行符以幫助進行水平滾動。

這給我們留下了這一點:

use strict; 
use warnings; 

use HTML::TokeParser::Simple; 

my $bunchotxt = << 'END_MESSAGE'; 
<a href="http://link.com/image.gif"> 
    <img 
     class="alignleft size-thumbnail wp-image-295" 
     src="http://link.com/image.gif" 
     alt="shredding" 
     width="150" 
     height="150" /> 
</a> 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis convallis 
fringilla dui eget cursus. Nullam in mauris viverra elit pharetra fringilla. 
Pellentesque gravida ligula sit amet magna blandit, semper luctus enim semper. 
Nam a sem ut ex aliquam consectetur. Nulla enim metus, porta at elementum non, 
facilisis ullamcorper nisl. Vestibulum sed iaculis ante. Nullam mollis luctus 
posuere. 

Suspendisse ipsum odio, iaculis in malesuada id, varius 
END_MESSAGE 

my $parser = HTML::TokeParser::Simple->new(string => $bunchotxt); 

while (my $tag = $parser->get_tag('img')) { 
    my $src = $tag->get_attr('src'); 
    $bunchotxt =~ s/\Qsrc="$src"\E/src:"replaced"/g; 
    print "$bunchotxt\n"; 
} 

和結果的第一行是:

<a href="http://link.com/image.gif"><img class="alignleft size-thumbnail wp-image-295" src:"replaced" ... 
+0

這是一個很好的解決方案。經過多一點研究,我發現了tokeparser的set_attr。這實際上也起作用,但我無法看到如何將該變化提交回字符串。這工作100%。感謝您耐心使用我公認的快速示例代碼。 – 2crd3o

+0

@ 2crd3o所以是'src:'在替換中應該是'src ='的拼寫錯誤? –

相關問題