天道酬勤,学无止境

正则表达式检测IE9及以下?(Regex to detect IE9 and below?)

问题

我正在尝试用 Java 编写一个正则表达式模式来检测用户代理是否小于或等于 Internet Explorer 9。这里有很多示例:

http://www.useragentstring.com/pages/Internet%20Explorer/

主要要点是用户代理字符串中有一个字符串,名为:“MSIE XXXX。我当前的正则表达式模式是这样的:

MSIE ([1-9]|9)

这似乎有效,除非我在运行 MSIE 10.0 或 MSIE 11.0 时出现问题。 关于如何只匹配 1-9 而没有 10.0 或 11 的任何想法?

回答1

在旧版本中,主版本号后面总是有一个点,您可以在正则表达式中使用它:

MSIE [1-9]\.

另一种写法是期望一个 1 到 9 之间的数字后跟一个非数字 char :

MSIE [1-9][^0-9]

回答2

只匹配 5-9 而不是 1-9。 几乎有 0 人使用 IE 4 及以下版本。

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Javascript IE检测,为什么不使用简单的条件注释? [复制](Javascript IE detection, why not use simple conditional comments? [duplicate])
    问题 这个问题已经在这里有了答案: 检查用户是否正在使用IE (31个答案) 1年前关闭。 为了检测IE,大多数Javascript库都会执行各种技巧。 jQuery似乎在页面的DOM中添加了一个临时对象来检测某些功能, YUI2在其YAHOO.env.ua = function() (文件yahoo.js )中的用户代理上进行正则表达式 阅读此答案后,我想到这是真的,为了简单地检测Javascript中的IE,我们可以简单地将其添加到页面中: <!--[if IE]><script type="text/javascript">window['isIE'] = true;</script><![endif]--> <script type="text/javascript" src="all-your-other-scripts-here.js"></script> 现在,只需执行以下操作即可为我们所有的Javascript代码设置window.isIE变量: if(window.isIE) ... 除了由于必须将其添加到所有页面而可能导致的痛苦之外,还有其他我可能没有意识到的问题/注意事项吗? 仅供参考:我知道使用对象检测比使用浏览器检测更好,但是在某些情况下,您仍然必须使用浏览器检测。 回答1 James Padolsey在GitHub上放了一些代码片段,我将在这里引用: /
  • IE 用户代理正则表达式(包括 IE11 和兼容视图)(IE user agent regexp (including IE11 and compat view))
    问题 我需要你的帮助,为用户代理字符串创建一个 IE 特定的正则表达式。 我的目标是获得正确的 IE 版本(包括 IE11),并检查浏览器是否正在运行“Compat View”。 因此,例如,我在正常模式下对 IE9 的期望结果: IE 9.0和“兼容视图”中的 IE9: IE 9.0 CV 当不考虑兼容性视图时,此模式最多适用于 IE 10: MSIE ([0-9]{1,}[\.0-9]{0,}) 但是,兼容视图中的 IE9 将具有类似于... MSIE 7.0 ... Trident/5.0的用户代理字符串。 此外,IE11 将不再在字符串中使用MSIE (参见下面的示例)。 我不太了解正则表达式,所以我需要你的模式帮助。 虽然我认为三叉戟模式应该很明显, /Trident\/\d/ 。 我将在 C# 中使用它,所以我想我需要做这样的事情(欢迎提出建议): var regex = new Regex(@"MSIE ([0-9]{1,}[\.0-9]{0,})"); var match = regex.Match(Request.UserAgent); if (match.Success) //handle match.Groups 一些可能有用的信息: IE9 的用户代理字符串: 与 IE8 类似,IE9 的兼容性视图将映射到 IE7 标准模式,并且在兼容性视图中 IE9 的
  • String.match() for regex \s on 中文字符串在 IE8 和 IE9/Chrome/Firefox/...(String.match() for regex \s on chinese string works differently between IE8 and IE9/Chrome/Firefox/…)
    问题 当我使用正则表达式\s匹配汉字空白 (  ) 在 IE8 中,它返回 false,这意味着它是一个两字节的字符。 另一方面,在 IE9(或更高版本的 IE、Chrome、Firefox、Safari 等)中,它返回 true,这意味着 是一个一字节的字符。 实际上,它是一个两字节的字符。 我想知道 IE8 的正则表达式引擎和其他更高版本浏览器的引擎之间是否有任何区别。 它是什么? 代码如下。 function OneByteCharCheck(value) { if (value.match(/^(?:[a-zA-Z0-9@\;\:\[\]\{\}\|\^\=\/\!\*\`\"\#\$\+\%\&\'\(\)\,\.\<\>\-\_\?\\\s()ァ-ン゙゚ 。「」、・ヲ~]*)*$/)) { return true } return false; } 回答1 差异是由于 IE8 的一致性很差,甚至在其发布时也不符合许多 Web 标准。 在浏览器堆栈上运行我的测试页面显示 IE8 只能匹配 Unicode 空格字符 (Zs) 类别中的 17 个字符中的 1 个,而 IE9 成功匹配所有 17 个字符(包括 U+3000)。 这很可能是由于 Microsoft 努力符合IE9 及更高版本的许多 Web 标准。 即使在IE8 (2009 年3 月发布)中,它的
  • Regex to detect IE9 and below?
    I am trying to write a regex pattern in Java to detect if a user agent is less than or equal to Internet Explorer 9. There are quite a few examples here: http://www.useragentstring.com/pages/Internet%20Explorer/ The main gist is there will be a string in the user agent string called: "MSIE XXXX). My current regex pattern is this: MSIE ([1-9]|9) Which seems to work except there are problems when I do MSIE 10.0 or MSIE 11.0 it matches. Any ideas on how to only match 1-9 and no 10.0 or 11?
  • 文本区域变化检测(Textarea onchange detection)
    问题 如何使用javascript检测textarea上的更改事件? 我正在尝试检测您输入的剩余字符数。 我尝试使用onchange事件,但这似乎仅在焦点移开时才起作用。 回答1 您将需要为此使用onkeyup和onchange 。 onchange将阻止上下文菜单粘贴,并且onkeyup将为每次击键触发。 有关代码示例,请参见我关于如何在textArea上添加maxlength的答案。 回答2 现在是2012年,后PC时代已经到来,我们仍然必须为像这样的基本问题而苦苦挣扎。 这应该非常简单。 在实现梦想之前,最好的方法是跨浏览器:使用input和onpropertychange事件的组合,如下所示: var area = container.querySelector('textarea'); if (area.addEventListener) { area.addEventListener('input', function() { // event handling code for sane browsers }, false); } else if (area.attachEvent) { area.attachEvent('onpropertychange', function() { // IE-specific event handling code }); }
  • 编写正则表达式来检测重复字符[重复](Writing a regex to detect repeat-characters [duplicate])
    问题 这个问题在这里已经有了答案: 正则表达式匹配最长的重复子字符串5 个回答 7年前关闭。 我需要编写一个正则表达式,它可以识别一个在末尾具有重复字符集的单词。 根据以下代码片段,重复字符集是An 。 我需要编写一个正则表达式,以便发现并显示它。 根据以下代码, \\w将匹配任何单词字符(包括数字、字母或特殊字符)。 但我只想识别英文字符。 String stringToMatch = "IranAnAn"; Pattern p = Pattern.compile("(\\w)\\1+"); Matcher m = p.matcher(stringToMatch); if (m.find()) { System.out.println("Word contains duplicate characters " + m.group(1)); } 更新 Word contains duplicate characters a Word contains duplicate characters a Word contains duplicate characters An 回答1 你想赶上在您所设定的尽可能多的字符,所以不是(\\w) ,你应该使用(\\w+)和你想要的顺序是在年底,所以你需要添加$ (和我有删除了\\1之后的+ ,这对检测重复没有用:只需要重复一次):
  • 检测没有特征检测的IE9(Detect IE9 without feature detection)
    问题 所以我需要检测 IE 9。我知道我真的应该使用功能检测,但我不知道是什么功能导致了我的问题,我只知道 IE 9 导致了我的问题。 我已经解决了我的问题(对于那些感兴趣的人,我在这里问了一个关于这个问题的问题,但实际上,它无关紧要)。 现在我只想为 IE9 实现这个hack修复,因为这是让我头疼的原因。 那么检测 IE 9 的最佳方法是什么? 回答1 这些 IE 条件会给你一个 CSS 类来关闭: <!--[if lt IE 7]> <html class="lt-ie10 lt-ie9 lt-ie8 lt-ie7" lang="en"> <![endif]--> <!--[if IE 7]> <html class="lt-ie10 lt-ie9 lt-ie8" lang="en"> <![endif]--> <!--[if IE 8]> <html class="lt-ie10 lt-ie9" lang="en"> <![endif]--> <!--[if IE 9]> <html class="lt-ie10" lang="en"> <![endif]--> <!--[if gt IE 9]><!--> <html lang="en"> <!--<![endif]--> 所以如果你只关心 IE9,你可以这样做: <!--[if IE 9]> <html class=
  • 在JavaScript中检测IE版本(v9之前的版本)(Detect IE version (prior to v9) in JavaScript)
    问题 如果他们使用的是v9之前的Internet Explorer版本,我想将我们网站的用户退回至错误页面。 支持IE pre-v9只是不值得我们花费时间和金钱。 所有其他非IE浏览器的用户都可以使用,并且不应被退回。 这是建议的代码: if(navigator.appName.indexOf("Internet Explorer")!=-1){ //yeah, he's using IE var badBrowser=( navigator.appVersion.indexOf("MSIE 9")==-1 && //v9 is ok navigator.appVersion.indexOf("MSIE 1")==-1 //v10, 11, 12, etc. is fine too ); if(badBrowser){ // navigate to error page } } 这段代码能解决问题吗? 拒绝一些可能会以我的方式发表的评论: 是的,我知道用户可以伪造他们的useragent字符串。 我不在意是的,我知道编程专家更喜欢嗅探功能支持而不是浏览器类型,但是在这种情况下,我认为这种方法不可行。 我已经知道所有(相关)非IE浏览器都支持我需要的功能,而所有pre-v9 IE浏览器均不支持。 在整个站点中逐个功能地检查将是浪费。 是的,我知道有人尝试使用IE v1 (或> =
  • 正则表达式以检测无效的UTF-8字符串(Regex to detect Invalid UTF-8 String)
    问题 在PHP中,我们可以使用mb_check_encoding()来确定字符串是否为有效的UTF-8。 但这不是可移植的解决方案,因为它需要编译并启用mbstring扩展名。 此外,它不会告诉我们哪个字符无效。 是否存在可以匹配给定字符串中无效的UTF-8字节的正则表达式(或其他100%可移植的其他方法)。 这样,可以在需要时替换那些字节(保留二进制信息,例如在构建包含二进制数据的测试输出xml文件时)。 因此,将字符转换为UTF-8会丢失信息。 因此,我们可能要转换: "foo" . chr(128) . chr(255) 进入 "foo<128><255>" 因此,仅“检测”字符串不够好,我们就需要能够检测到哪些字符无效。 回答1 您可以使用此PCRE正则表达式来检查字符串中的有效UTF-8。 如果正则表达式匹配,则该字符串包含无效的字节序列。 它是100%可移植的,因为它不依赖于PCRE_UTF8进行编译。 $regex = '/( [\xC0-\xC1] # Invalid UTF-8 Bytes | [\xF5-\xFF] # Invalid UTF-8 Bytes | \xE0[\x80-\x9F] # Overlong encoding of prior code point | \xF0[\x80-\x8F] # Overlong encoding of
  • PHP:如果Internet Explorer 6、7、8或9(PHP: If internet explorer 6, 7, 8 , or 9)
    问题 我想在PHP中针对Internet Explorer的不同版本执行以下条件: if($browser == ie6){ //do this} elseif($browser == ie7) { //dothis } elseif... 我在相似的代码上看到了许多变体,但是正在寻找一种超级简单的东西,非常容易编写一些if和else并做不同的事情。 谢谢 编辑:我需要它向用户显示一些不同的消息,所以CSS条件等都是不好的。 回答1 这是我最终使用的变体形式,它检查IE8及以下版本: if (preg_match('/MSIE\s(?P<v>\d+)/i', @$_SERVER['HTTP_USER_AGENT'], $B) && $B['v'] <= 8) { // Browsers IE 8 and below } else { // All other browsers } 回答2 可以继续与IE10和IE11一起使用的版本: preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches); if(count($matches)<2){ preg_match('/Trident\/\d{1,2}.\d{1,2}; rv:([0-9]*)/', $_SERVER['HTTP_USER_AGENT'],
  • 正则表达式,检测以某个字符开头的所有字符串(Regex , Detect all strings preceded with a certain character)
    问题 如何在 c# 中检测所有以 '%' 或 '$' 开头的字符串? 编辑 : 例如,如果我有以下字符串: string test = "Shipments will cost $150USD , which representes a rise of %34 ." 如何使用正则表达式检测$150USD和%34 ? 回答1 如果您的意思是查找所有单词,则可以使用该正则表达式。 (?<=\s?)[%$]\w+(?=\s?) 因此在出Shipments will cost $150USD, which representes a rise of %34. 它将找到$150USD和%34 。 C# 代码是: String subjectString = "Shipments will cost $150USD, which representes a rise of %34."; var matches = Regex.Matches(subjectString, @"(?<=\s?)[%$]\w+(?=\s?)"); foreach (Match match in matches) { var value = match.Value; } 回答2 就这么简单: string s = "Shipments will cost $150USD , which representes a
  • SQL中的正则表达式来检测一个或多个数字(regex in SQL to detect one or more digit)
    问题 我有以下查询: SELECT * FROM `shop` WHERE `name` LIKE '%[0-9]+ store%' 我想匹配显示'129387 store'字符串,但上面的正则表达式不起作用。 这是为什么? 回答1 使用 REGEXP 运算符而不是LIKE运算符 试试这个: SELECT '129387 store' REGEXP '^[0-9]* store$'; SELECT * FROM shop WHERE `name` REGEXP '^[0-9]+ store$'; 检查 SQL FIDDLE 演示 输出 | NAME | |--------------| | 129387 store | 回答2 如果你的意思是 MySQL, LIKE没有实现正则表达式。 它实现了更受限制的 SQL 模式匹配,它只有两个特殊运算符: %匹配任何字符序列,而_匹配任何单个字符。 如果要进行正则表达式匹配,必须使用REGEXP或RLIKE运算符: SELECT * FROM shop WHERE name REGEXP '[0-9]+ store' MySQL 的正则表达式语言不包含\d来指定数字,但您可以将其写为: SELECT * FROM shop WHERE name REGEXP '[[:digit:]]+ store' 如果商店名称必须以数字开头
  • IE9-11 检测变换样式:preserve-3d(IE9-11 detecting transform-style: preserve-3d)
    问题 我为一个项目制作了一个 3d 类型的菜单,自然 IE 会导致问题,因为 IE10+,即使 3d-transforms 工作,也不支持 transform-style:preserve-3d。 我尝试了变通方法,通过对 3d 菜单容器的每个子元素应用变换,但至少可以说动画看起来很糟糕。 决定完全为 IE 删除 3d,但无法为 IE10+ 使用条件样式表,我尝试以这种方式检测 preserve-3d 属性值: var detect = document.createElement("div"); detect.style.transformStyle = "preserve-3d"; if (detect.style.transformStyle.length > 0) { document.getElementsByTagName("html")[0].className = "preserve3D"; } 我注意到在上述情况下 IE9+ 返回长度 0,因为它不理解该值,因此单独留下 HTML 标记。 Chrome 和 FF 知道preserve-3d,因此该类被添加。 我只能通过将 IE11 的用户代理字符串设置为 IE9 和 IE10 来测试这一点。 我的第一个问题是:我可以期望这种方法(通过在 IE11 中设置用户代理进行测试)是一种故障安全的方法,还是我需要使用真正的
  • Sublime Text正则表达式未检测到多行标签(Sublime Text regex not detecting multiline tags)
    问题 我这里有这个正则表达式; \[sometag\](.*)\[/sometag\] 应该捕获[sometag]标记包围的文本。 它适用于这些标签中包含的单行信息,就像在字符串[sometag]this is a bit of text[/sometag] 。 但这对跨多行的文本不起作用,就像这样; [sometag] here is more text it spans more than one line [/sometag] 由于某种原因,Sublime text的正则表达式查找器无法识别多行中的标签。 我想知道这是Sublime Text的问题,可切换的选项还是我个人对正则表达式的无能。 回答1 首先,使用dotall修饰符(?s)来使点与换行符也匹配。 (?s)\[sometag\](.*?)\[\/sometag\] 演示 回答2 如果由于某些原因不允许修改点的模式,则可以采取以下措施: [sometag](.|\n)+?[/sometag]
  • 此Java正则表达式如何检测回文?(How does this Java regex detect palindromes?)
    问题 这是一系列教育正则表达式文章的第三部分。 因此,此正则表达式如何找到三角数? (首先引入了嵌套引用),以及如何将a ^ nb ^ n与Java正则表达式匹配? (其中进一步详细说明了先行“计数”机制)。 这部分介绍了嵌套断言的一种特定形式,当与嵌套引用结合使用时,它可使Java regex匹配大多数人认为“不可能”的东西:回文! 回文的语言是不规则的; 它实际上是上下文无关的(对于给定的字母)。 就是说,现代正则表达式实现不仅可以识别常规语言,而且Perl / PCRE的递归模式和.NET的平衡组还可以轻松识别回文(请参见:相关问题)。 但是,Java的正则表达式引擎都不支持这些“高级”功能。 但是“某人” ( * wink * )设法编写了以下正则表达式,似乎可以很好地完成工作(另请参见ideone.com): public class Palindrome { // asserts that the entirety of the string matches the given pattern static String assertEntirety(String pattern) { return "(?<=(?=^pattern$).*)".replace("pattern", pattern); } public static void main(String[]
  • 使用正则表达式解析专有标签语法 ​​- 如何检测嵌套标签?(Parsing proprietary tag syntax with regex - how to detect nested tags?)
    问题 我想解析这样的东西: Hi [{tagname:content}] [{tag1:xnkudfdhkfujhkdjki diidfo now nested tag [{tag2: more data here}] kj udf}] 我正在使用这个 PCRE 正则表达式来获取\[{(.*?)}\]之间的所有数据并且它有效,但不适用于嵌套标签。 我不是 PCRE 专家。 回答1 PCRE 和 Perl 一样可以匹配任意深度的嵌套结构。 这是一个经过测试的脚本: 正则表达式匹配嵌套括号 <?php // test.php Rev:20120701_0800 $re_nested_double_bracket ='% # Rev:20120701_0800 # Match [{...[{...}]...}] structure with arbitrary nesting. \[\{ # Opening literal double bracket. ( # $1: Contents of double brackets. (?: # Group for contents alternatives. [^\[\}]++ # Either one or more non-brackets, | (?R) # or a nested bracket pair, | \[ # or the
  • 如何检测Javascript正则表达式中的命名空间字符串?(How to detect namespace string in Javascript regular expression?)
    问题 我需要检查一个字符串是否代表有效的命名空间格式。 命名空间由用点分隔的 id 组成。 每个 id 以字母字符开头并以字母数字字符结尾。 有效的命名空间: "com.company.package" "com.company" "com" 无效的命名空间: "1com.company.package" "com.1company" "com.com%any" ".com.company" "com.company." "com " " com" "" "." "com..company" 目前我使用这个简单的正则表达式,但它真的没有检查所有这些无效的命名空间: if( /^[\w\.]$/.test( namespaceStr ) ) { //valid namespace } else { //invalid namespace } 对于检查字符串是否代表有效命名空间的小而有效的方法,还有更好的建议吗? 这是一个小 jsfiddle,可用于测试此正则表达式:http://jsfiddle.net/bA85y/ 回答1 编辑:这个应该适用于每种情况: /^(?:[a-z]\d*(?:\.[a-z])?)+$/i 如果您不关心捕获更短的组: /^([a-z]\d*(\.[a-z])?)+$/i 一点解释: ^ // Start ( // Open group [a-z]\d* /
  • 如何使用c#检测到包含尾随逗号的无效JSON?(How can I detect invalid JSON containing a trailing comma with c#?)
    问题 是的,是的,我知道有无数关于检测无效的Json的帖子。 他们都说相同的话:尝试解析或反序列化对象。 你猜怎么着? 在这种情况下,Json.NET会愉快地解析我格式错误的JSON,并且不会抱怨。 我认为我需要澄清一下:JSON唯一的问题是数组中的尾部逗号。 以下说明了我的问题: string badJson = "{ 'array' : [ {'objName1' : 'value1'}, {'objName2' : 'value2'}, {'objName3' : 'value3'}, ] }"; var obj = JObject.Parse(badJson); JSON在浏览器中无效,因为它在数组中有一个逗号结尾,但是很高兴将其解析为一个jobject。 由于我实际上无法使用序列化来检测此问题,我该怎么办? 请注意,我尝试序列化为一个对象,该对象产生了相同的结果。 更新: 以下代码将正确检测逗号并将其删除,以防万一需要这样做: var regex = new Regex(@"(.*?),\s*(\}|\])",(RegexOptions.Multiline)); var cleanJson = regex.Replace(content, m => String.Format("{0} {1}",m.Groups[1].Value,m.Groups[2].Value))
  • 检测字符串是否包含空格(Detect if string contains any spaces)
    问题 如何检测字符串中是否包含空格字符? 下面仅检测实际的空格字符。 我需要检查任何空白。 if(str.indexOf(' ') >= 0){ console.log("contains spaces"); } 回答1 您所拥有的将在字符串中的任意位置找到一个空格,而不仅仅是单词之间。 如果要查找任何类型的空格,可以使用此空格,该空格使用正则表达式: if (/\s/.test(str)) { // It has any kind of whitespace } \s表示“任何空白字符”(空格,制表符,垂直制表符,换页符,换行符等),并将在字符串中的任何位置找到该字符。 根据MDN, \s等效于: [ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2008​\u2009\u200a​\u2028\u2029​​\u202f\u205f​\u3000] 。 由于某种原因,我最初将您的问题读为“如何查看字符串是否仅包含空格?” 所以我回答如下。 但是正如@CrazyTrain指出的那样,问题并非如此。 不过,我会保留它,以防万一... 如果您的字面意思是空格,那么正则表达式可以做到这一点: if (/^ *$/.test(str)) { // It has
  • 在字符串中检测大于“>”和小于“<”的正则表达式[重复](Regex that detects greater than “>” and less than “<” in a string [duplicate])
    问题 这个问题在这里已经有了答案: 正则表达式大于和小于3 个回答 6年前关闭。 我需要一个正则表达式来替换字符串上的大于和小于符号 我已经试过了 var regEx = "s/</</g;s/>/>/g" var testString = "<test>" alert(testString.replace(regEx,"*")) 我第一次使用它,请放轻松:)谢谢 回答1 您可以使用正则表达式| 喜欢 var regEx = /<|>/g; var testString = "<test>" alert(testString.replace(regEx,"*")) 小提琴 回答2 用于大于和小于符号。 var string = '<><>'; string = string.replace(/[\<\>]/g,'*'); alert(string); 对于特殊字符 var string = '<><>'; string = string.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g,'_'); alert(string); 回答3 在类之前的代码中插入正则表达式 using System.Text.RegularExpressions; 下面是使用正则表达式替换字符串的代码 string input = "Dot > Not Perls"; // Use