【问题标题】:RegEx with JavaScript matches more that it should带有 JavaScript 的 RegEx 匹配得更多
【发布时间】:2012-04-27 06:15:36
【问题描述】:

相当简单的 HTML(省略号表示代码较多):

...Profile">
 Some text
 </a>...

使用 JavaScript 的在线 RegEx 测试器 (http://regexpal.com/),我可以使用以下表达式提取“一些文本”(注意它包含换行符):

(?=Profile">)[\s\S]*(?=</a)

(不幸的是,JavaScript 不支持后视,所以我也提取了Something"> 以稍后将其删除。但是,问题是下面的代码

var ShowContent = document.getElementById(id);
ShowContent = ShowContent.innerHTML;
var patt3=/Profile">[\s\S]*(?=<)/;
var GetName=patt3.exec(ShowContent);
alert(GetName);

不提取在线测试器显示的内容,但它还包括“某些文本”之后的整个 HTML 代码(IE,不仅是结尾 &lt; /a,还包括后面的所有内容)。

有人有什么建议吗?

【问题讨论】:

  • 有人有什么建议吗? - 是的。不使用正则表达式来解析 HTML 将是一个很好的开始。
  • 谢谢。以后肯定会学DOM,不过现在急需一个临时解决办法。

标签: javascript regex html-parsing


【解决方案1】:

当您确定提供的字符串不包含可能的缺陷时(例如,&lt;input value='Profile"&gt;'&gt;,将[\s\S]* 替换为[^&lt;]*(除&lt; 之外的任何内容):

var patt3 = /Profile">([^<]*)/;
var getName = patt3.exec(ShowContent);
getName = getName ? getName[1] : ''; // If no match has been found -> empty string

alert(getName);

(我也将GetName替换为getName,因为以大写字母开头的camelCased变量通常表示构造函数。遵守约定,不要以大写字母开头非构造函数)。

【讨论】:

  • 已经有一个可以用来提取节点值的 DOM(免费!)时,使用正则表达式有什么意义?
  • @Tomalak 该问题没有包含足够的信息来发布有关 DOM 遍历的答案。但是,它确实包含查找文本的明确条件。
  • @Rob W 非常感谢!是的,我将使用它作为临时解决方案,但会花时间学习 DOM,以便以后更新我的家庭代码。
  • 是的,没错。这需要一些澄清。不过,这并不难。看起来应该提取单个特定链接的文本。
【解决方案2】:

你最好让量词不贪婪。试试这个正则表达式:

/Profile">([\s\S]*?)(?=<)/

【讨论】:

    猜你喜欢
    • 2021-06-05
    • 1970-01-01
    • 2010-09-10
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多