代码之家  ›  专栏  ›  技术社区  ›  awrigley

使用正则表达式查找不带alt属性的img标记

  •  15
  • awrigley  · 技术社区  · 15 年前

    我正在浏览一个大型网站(1600多页),使其通过W3C WAI的优先级1。因此,像图像标签这样的东西需要有alt属性。

    查找没有alt属性的img标记的正则表达式是什么?如果可能的话,给我一个小小的解释,这样我就可以找到其他的问题。

    我在VisualWebDeveloper2008的办公室。编辑>>查找对话框可以使用正则表达式。

    7 回复  |  直到 7 年前
        1
  •  0
  •   Thomas    15 年前

    这真的很棘手,因为正则表达式主要是为了匹配现有的内容。有了这个小把戏,你可以做一些事情,比如“找到一个不在b前面/后面的a”,等等,但我认为对你来说最实用的解决方法不是这个。

    我的建议有点依赖于你现有的代码,不要做太疯狂的事情,你可能需要对它进行微调,但我认为这是一个很好的尝试,如果你真的想用regex搜索你的问题。

    所以我建议找到所有的img标签 可以 (但不需要)具有img元素的所有有效属性。这是否是一种你可以使用的方法,由你来决定。

    建议:

    /<img\s*((src|align|border|height|hspace|ismap|longdesc|usemap|vspace|width|class|dir|lang|style|title|id)="[^"]"\s*)*\s*\/?>/
    

    目前的限制是:

    1. 它期望您的属性值用双引号分隔,
    2. 它不考虑*事件属性上可能的内联,
    3. 它找不到具有“非法”属性的img元素。
        2
  •  31
  •   Gruffy    12 年前

    基于布莱克先生和罗伯茨先生126的回答:

    /(<img(?!.*?alt=(['"]).*?\2)[^>]*)(>)/
    

    这将匹配代码中没有alt标记的任何地方的img标记,或后面不带“’或‘’(即alt标记无效)的alt标记。

    分解:

    (          : open capturing group
    <img       : match the opening of an img tag
    (?!        : open negative look-ahead
    .*?        : lazy some or none to match any character
    alt=(['"]) : match an 'alt' attribute followed by ' or " (and remember which for later)
    .*?        : lazy some or none to match the value of the 'alt' attribute
    \2)        : back-reference to the ' or " matched earlier
    [^>]*      : match anything following the alt tag up to the closing '>' of the img tag
    )          : close capturing group
    (>)        : match the closing '>' of the img tag
    

    如果代码编辑器允许用regex搜索和替换,则可以将其与替换字符串结合使用:

    $1 alt=""$3
    

    要查找任何不含alt的img标记并用空alt标记附加它们。这在为HTML电子邮件等使用间隔符或其他布局图像时很有用。

        3
  •  16
  •   squareman    10 年前

    以下是我在自己的环境中所做的尝试,使用大量的企业代码库,并取得了一些成功(没有发现误报,但肯定找到了有效的案例):

    <img(?![^>]*\balt=)[^>]*?>
    

    搜索过程中发生了什么:

    1. 找到标签的开头
    2. 查找没有零个或多个不是右括号的字符,同时
    3. 检查是否缺少以“alt”开头的单词(“\b”是否用于确保在类值等内容上不匹配单词中间名),并后跟“=”,然后
    4. 查找不是右括号的零个或多个字符
    5. 找到右括号

    所以这将匹配:

    <img src="foo.jpg" class="baltic" />
    

    但这两者都不匹配:

    <img src="foo.jpg" class="baltic" alt="" />
    <img src="foo.jpg" alt="I have a value.">
    
        4
  •  8
  •   Mr.Black    12 年前

    这在Eclipse中有效:

    <img(?!.*alt).*?>

    我也在更新第508节!

        5
  •  6
  •   Roberts126    13 年前

    这对我有用。

    ^<img(?!.*alt).*$
    

    这匹配以开头的任何字符串 <img 在alt属性之前不包含任何数量的字符。它甚至适用于 src="<?php echo $imagename; ?>" 属性类型。

        6
  •  1
  •   edercortes    7 年前

    简单有效:

    <img((?!\salt=).)*?

    这个正则表达式用于查找 <img> 标签丢失 alt 属性。

        7
  •  1
  •   Niels Vanhorenbeeck    7 年前

    这完全可以通过以下regex实现:

    <img([^a]|a[^l]|al[^t]|alt[^=])*?/>
    

    寻找不存在的东西是相当棘手的,但是我们可以通过寻找一个不以“a”开头的群体,或者一个不以“l”结尾的“a”来欺骗他们,依此类推。