仅替换与img list var匹配的手术精度的图像和标签

时间:2015-04-24 18:32:10

标签: php html regex

确定我的目标是删除我在数组或组中指定的所有图像及其标记,它应该删除整个图像和标记,如果它包含在链接中,则可以正常工作。

到目前为止,我对此工作有点但远非完美此版本只删除不在href标签中的图像,我需要它以双向工作。

因此,如果我们有<img src="test1.gif" width="235">,即使它包含其他代码,也必须删除它,即使图像名称匹配,它也会被链接包围。

因此,组中包含的任何图像都必须使用标记和/或包含在我的var中的图像的链接完全删除。

这是我到目前为止所拥有的。 #<img[^>]+src=".*?(test1.gif|test2.png|test3.jpg)"[^>]+>?#i

最终我要做的事情并不像我希望的那样简单,所以我正在跳跃一些正则表达式大师可以帮助完成这项任务,因为我无法在这里找到任何东西,或者网络最多只是替换所有图像页面不是特定的图像。不是我需要成为正则表达式的原因是因为这必须适用于其他基于preg_replace的代码,是的,我知道这不是最好的方法。

UPDATED将此添加为示例抱歉任何混淆。

这都是基于PHP的!

所以这个var将包含我们需要替换的所有图像。什么都没有。

$ m_rimg =&#34; imagewatever.gif | test.jpg | animage.png&#34 ;; preg_replace('#<img[^>]+src=".*?('.$m_rimg.')"[^>]+>?#i','');

这几乎可以正常工作但不正确,因为它还必须删除链接href标记中包含的图像,并删除图像以及链接(如果有)。所以基本上我需要我修改后才能正确使用<img src="whatever.gif" width=""><a href="www.testthis.net"><img src="whatever.gif" width=""></a>,但它必须只替换或删除var列表中匹配的图像,而不仅仅是替换所有图像,即图像......我可以这样做更复杂。

我希望这能更好地解释它。

2015年4月25日更新 好的,我尝试了最后一个用于测试下面信息的文件。

我不得不用一些\来修改它所以我没有得到解析错误,所以对于任何想要做类似于我的需要的人来说。

这很有效。我只是改变了你给我这样的东西。 "#(?:<a\b[^>]*?>)?(<img[^>]+src=[\"'][^>]*?($m_rimg)['\"][^>]*>)(?:<\/a>)?#is"

并且没有使用preg_quote,不知道为什么但是根本不起作用但没有preg_quote它在我刚刚做的一些测试中工作到目前为止。

我被告知不要使用|但这似乎有用吗,你们会建议别人怎么做?

至于这是某些人所标记的另一个回答问题的副本,我不认为是这样的,因为我看到了我所说的问题的答案,并且它不一样我完全看到了,并没有做我需要做的确切的事情匹配我的var中的什么。虽然是的,它是正则表达相关它没有帮助,我试图在这里找到适合我的需要的东西,在发布前的方式。

我从一个用户那里得到了一个有用的答案,他解释了我这样做的原因。我希望现在可以提升他的欺骗状态,因为我的目标不是冒犯那些不认为我应该使用正则表达式作为HTML解析器脚本一部分的人。

1 个答案:

答案 0 :(得分:3)

尝试类似:

$DOM = new DOMDocument();
$DOM->loadXML('HTML_DOCUMENT');

$list = $DOM->getElementsByTagName('img');

foreach($list as $img){
    $src = $img->getAttribute('src');
    //only match if src contains `test1.gif`:
    if(stringEndsWith($src, 'test1.gif') ||
       stringEndsWith($src, 'test2.gif') ||
       stringEndsWith($src, 'test3.gif')) {
        $list->removeChild($img);
    }
}

function stringEndsWith($haystack, $ending, $caseInsensitivity = false)
{
    if ($caseInsensitivity)
        return strcasecmp(substr($haystack, strlen($haystack) - strlen($ending)), $haystack) === 0;
    else
        return strpos($haystack, $ending, strlen($haystack) - strlen($ending)) !== false;
}

或者,如您所述,仍然需要使用正则表达式方法根据<img>变量中的备用列表删除$m_rimg标记,并且包含任何<a>标记,请使用以下命令:

$re = "#(?:<a\b[^>]*?>)?(<img[^>]+src=["'][^>]*?('.$m_rimg.')['"][^>]*>)(?:<\/a>)?#is"; 
$str = "<img\n att=\"value\"\n src=\"sometext3456..,gjyg&&&test1.gif\" />\n\n<a href=\"link.html\"><img src=\"imagewatever.gif\"></a>"; 
$result = preg_replace($re, "", $str);

请注意,变量中的所有项目必须为preg_quote d,而不是|符号。

Demo