确定我的目标是删除我在数组或组中指定的所有图像及其标记,它应该删除整个图像和标记,如果它包含在链接中,则可以正常工作。
到目前为止,我对此工作有点但远非完美此版本只删除不在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解析器脚本一部分的人。
答案 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,而不是|
符号。