2010-10-27 77 views
10

我會通過大量網站(1600+頁),使其通過優先級1 W3C WAI。因此,像圖片標籤這樣的東西需要具備alt屬性。使用正則表達式找到的img標籤沒有alt屬性

什麼是尋找的img標籤沒有ALT屬性的正則表達式?如果可能的話,稍作解釋,以便我可以用它來查找其他問題。

我與Visual Web Developer中2008年的編輯辦公室>>查找對話框可以使用正則表達式。

+1

我不會爲此使用正則表達式。我寧願使用諸如html敏捷包(http://htmlagilitypack.codeplex.com/)或其他一些HTML解析器庫之類的東西。 – steinar 2010-10-27 21:12:03

回答

0

這確實是棘手的,因爲正則表達式主要是對匹配的東西是存在的。隨着環視掛羊頭賣狗肉,你可以做這樣的事情「找到一個沒有被前面/後面B」,等等,但我覺得你最務實的解決方案不會是。

我的建議依賴現有的代碼不做太瘋狂的事情,你可能需要微調它,但我認爲這是一個很好的選擇,如果你真的想要使用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元素。
+0

它並沒有直接工作,但它是一個足夠好的投票:我已經從你的答案中學到了一些東西,例如,最後需要掌握正則表達式。我也認爲VS的Find可以允許迭代搜索。與撇開這是不是有一個字符串(例如,ALT =「)的設施相結合將使這不費吹灰之力哦,好 – awrigley 2010-10-27 12:28:42

+0

@awrigley:。你是否能找出什麼是不工作的。例如,我有?包括'/'斜槓作爲RegEx分隔符,根本不需要,包括所有(合法)事件並不難,我只是不想打字。 – Thomas 2010-10-27 12:42:50

+0

我試過沒有分隔符,但沒有喜悅,我想我已經找到了大部分的手動操作,但是即使引入了一個錯誤,結果也會返回是0.不能責怪你不想鍵入 – awrigley 2010-10-27 13:14:12

6

這對我有用。

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

這符合與<img開始任何字符串不包含的alt屬性之前的任何數目的字符。它甚至適用於src="<?php echo $imagename; ?>"類型的屬性。

6

此工程在Eclipse:

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

我更新了第508呢!

+0

測試正則表達式的好地方是http://regexpal.com/。我使用它和http://www.regular-expressions.info/來建立我的,但它從來不容易。 – 2013-03-07 14:27:33

+0

如果你的img標籤沒有跨越多行(很可能與模板系統有關),因爲「。*」會在換行符間停止匹配,尋找不是那裏的右括號的_any_字符更安全。另外,你還要確保你不符合「class ='baltic'」,然後通過檢查「alt」之前的分詞符跳過真正的肯定。我在另一個評論中提供了一個詳細解釋的例子,但這裏是我找到的作品:「」* \ balt =)[^>] *?>「 – squareman 2015-08-07 22:01:57

+0

這適用於Visual Studio和Sublime Text中的我。 – ajaykarwal 2017-05-04 13:54:21

26

大廈Mr.Black和Roberts126答案:

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

這將在任上沒有Alt標籤或ALT標記,其後面沒有=「」或者=代碼的任何地方匹配img標籤''(即無效的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 

如果你的代碼編輯器允許搜索和正則表達式替換你可以結合替換字符串中使用這樣的:

$1 alt=""$3 

要找到任何ALT-少IMG標籤並將它們附加一個空白的alt標籤。當爲HTML電子郵件等使用間隔符或其他佈局圖像時,這非常有用。

+1

我對此進行了修改,使其成爲'/()*?)(/?>)/'這意味着您可以使用'\ 1 \ 2 alt =''\ 3'作爲替換文本,並且任何自動關閉標籤斜線將留在最後。 – BoffinbraiN 2014-02-11 11:44:22

+0

@BoffinbraiN看起來不錯:) – Gruffy 2014-02-14 12:07:09

+0

如何更新正則表達式,以便它將更新與img src文件名的alt屬性? From:' '收件人:'w3schools w3schools' – 2016-06-29 17:49:59

11

這裏是我只是想在自己的環境中一些好的成功了大規模的企業代碼庫(沒有發現假陽性,但肯定找到有效的情況下):

<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."> 
0

簡單有效:

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

此正則表達式適用於找到<img>標籤缺少alt屬性。

相關問題