想要个正则表达式,匹配所有标签

jimx1002 2010-01-07 11:51:40
想要一个正则表达式,匹配所有<img>标签,并且这个标签里SRC属性不能含有logo这个单词,包含这个单词的不匹配。
谢谢。
...全文
1754 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jimx1002 2010-01-07
  • 打赏
  • 举报
回复
谢谢楼上的几位同仁!
现在我还有个问题,就是我想匹配不含有“logo”,也不要含有“model”的所有<img>标签。
应该怎么做呢?
我的正则还没怎么去学,以瓣以少用到,实在自己搞不明,再谢谢各位了
骄傲青蛙 2010-01-07
  • 打赏
  • 举报
回复
to 10#

嗯, 在一个规则里实现这样的需要比较棘手
sports98 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 coolesting 的回复:]
引用 5 楼 sports98 的回复:
<img(?!.*?logo).*>

  <img - 开头数据
(?! - 负向预查后面的字符
.*?贪婪匹配logo前面所有数据
(?!.*?logo) - 意为匹配所有不包含logo
.*> 则是 匹配所有换行前的>      -  此处不使用 .*? 进行贪婪主要是为了避免 alt="abc>" 这样中间出现> 字符的情况

不过上面会出现个特例情况

例如

  <img src="abc.jpg" alt="logo图片">  alt提示包含logo
  <img src="test.jpg" logo=1 >  自定义属性


如果考虑这些情况,正则可以再细化到src位置

  <img(.*?)(src)=\"(?!.*?logo).*>


PHP code
分析得够精辟, 但有个bug <img(.*?)(src)=\"(?!.*?logo).*><img(.*?)(src)=\"?(?!.*?logo).*>

还有个问题, 用这个字符串时, 把中间多余的字符都匹配出来了$string="adsfasdfa<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>fasdfa<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>dsf<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>adsf";

preg_match('/<img(.*?)src=\"?(?!.*?logo).*>/',$string,$matches);

echo '<pre>';
print_r($matches);
echo '</pre>';
[/Quote]

其实以上问题我在测试时候也想过。问题结症位置就是 .*> 这个如果替换成.*? 则会导致由于提前碰到
alt 内或者其他非正常出现结尾区的 > 而导致匹配错误结束。
如果使用.*>匹配呢,则又要面临结尾标记与<img标记之间无明确的结束符导致你说的中间的数据也被
匹配出来。

我个人观点,在数据匹配上我们有时候面对这些问题无法再一个匹配规则内完成,那就尽量用最少的匹配
规则完成。如果确实要解决这些问题,比较简单的方法就是将<img标签所有数据全部提出,然后join下(用\n)最后再做提取,这样效率可能会略微低下,但单独一个规则来完成我们想要的这个匹配行为

至少我目前觉得矛盾有点大
骄傲青蛙 2010-01-07
  • 打赏
  • 举报
回复
不行, 你们看
<?php

$string="我<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>来<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>了<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>....";

preg_match('/<img(.*?)src=\"?(?!.*?logo).*>/',$string,$matches);

echo '<pre>';
print_r($matches);
echo '</pre>';

?>
骄傲青蛙 2010-01-07
  • 打赏
  • 举报
回复
<img(.*?)(src)=\"(?!.*?logo).*>
骄傲青蛙 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sports98 的回复:]
<img(?!.*?logo).*>

<img - 开头数据
(?! - 负向预查后面的字符
.*?贪婪匹配logo前面所有数据
(?!.*?logo) - 意为匹配所有不包含logo
.*> 则是 匹配所有换行前的>      -  此处不使用 .*? 进行贪婪主要是为了避免 alt="abc>" 这样中间出现> 字符的情况

不过上面会出现个特例情况

例如

<img src="abc.jpg" alt="logo图片">  alt提示包含logo
<img src="test.jpg" logo=1 >  自定义属性


如果考虑这些情况,正则可以再细化到src位置

<img(.*?)(src)=\"(?!.*?logo).*>
[/Quote]


分析得够精辟, 但有个bug <img(.*?)(src)=\"(?!.*?logo).*>

<img(.*?)(src)=\"?(?!.*?logo).*>

还有个问题, 用这个字符串时, 把中间多余的字符都匹配出来了

$string="adsfasdfa<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>fasdfa<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>dsf<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>adsf";

preg_match('/<img(.*?)src=\"?(?!.*?logo).*>/',$string,$matches);

echo '<pre>';
print_r($matches);
echo '</pre>';
luohao546151850 2010-01-07
  • 打赏
  • 举报
回复


楼上正解。。。。。。。。。。。。。。。。。。。。。。

例如

<img src="abc.jpg" alt="logo图片">  alt提示包含logo
<img src="test.jpg" logo=1 >  自定义属性


如果考虑这些情况,正则可以再细化到src位置

<img(.*?)(src)=\"(?!.*?logo).*>
[/Quote]
sports98 2010-01-07
  • 打赏
  • 举报
回复
<img(?!.*?logo).*>

<img - 开头数据
(?! - 负向预查后面的字符
.*?贪婪匹配logo前面所有数据
(?!.*?logo) - 意为匹配所有不包含logo
.*> 则是 匹配所有换行前的> - 此处不使用 .*? 进行贪婪主要是为了避免 alt="abc>" 这样中间出现> 字符的情况

不过上面会出现个特例情况

例如

<img src="abc.jpg" alt="logo图片"> alt提示包含logo
<img src="test.jpg" logo=1 > 自定义属性


如果考虑这些情况,正则可以再细化到src位置

<img(.*?)(src)=\"(?!.*?logo).*>
骄傲青蛙 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lenovor61i 的回复:]
PHP code<pre><?php$string="adsfasdfa<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>fasdfadsfadsf";preg_match_all('/<img(?!.*?logo).*>/',$string,$matches);print_r($matches);?></pre>
[/Quote]

看不明, /<img(?!.*?logo).*>/ 这个能完全匹配了? 谁来解释一下
sports98 2010-01-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lenovor61i 的回复:]
PHP code<pre><?php$string="adsfasdfa<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>fasdfadsfadsf";preg_match_all('/<img(?!.*?logo).*>/',$string,$matches);print_r($matches);?></pre>
[/Quote]

正解
lenovor61i 2010-01-07
  • 打赏
  • 举报
回复

<pre>
<?php
$string="adsfasdfa<img src='http://avatar.profile.csdn.net/3/6/F/2_jimx102.jpg'>fasdfadsfadsf";
preg_match_all('/<img(?!.*?logo).*>/',$string,$matches);
print_r($matches);
?>
</pre>
number123456 2010-01-07
  • 打赏
  • 举报
回复
$html =  "爱上对方 <img src=\"upload.gif\" /> 士大夫";

$pre = "/<img(.[^<]*)src=\"?(.[^<\"]*)\"?(.[^<]*)\/?>/is";
if(preg_match_all($pre,$html,$p)){
foreach($p[2] as $path){
if(count(explode("logo",strtolower($path)))>1){
}else{
echo $path."<Br>";
}
}
}

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧