regex 用于查找不在HTML属性中的特定字符串的正则表达式

nr7wwzry  于 2022-11-18  发布在  其他
关注(0)|答案(2)|浏览(105)

我的例子是:我有一个包含HTML元素的字符串:

<a href="something+specific_string" title="testing">This is a text and "specific_string"</a>

我需要一个正则表达式来只匹配不在HTML属性中的正则表达式。
这是我当前的正则表达式,它可以工作,但当字符串用双引号括起来时,它会给出误报

((?!\"[\w\s]*)specific_string(?![\w\s]*\"))

我已经尝试了以下正则表达式:

((?!\"[\w\s]*)specific_string(?![\w\s]*\"))

它可以工作,但当字符串用双引号括起来时,它会给出误报

bvjveswy

bvjveswy1#

如果您想获取标记中的内容,您可能会尝试使用split()工具;每隔”〉”或“〈”就剪下一个字符串,基本上是这样的:

let string = "<a href='something+specific_string' title='testing'>This is a text and 'specific_string'</a>";

string = string.split('>');
string = string[1].split('<');

console.log(string)

所以,当你想操作它的时候,只要使用字符串的位置0就可以了。

eqfvzcg8

eqfvzcg82#

虽然它在简单的情况下就足够了,但是您应该知道,正是oftensaid使RegExp不适合解析HTML,根据环境的不同,您最好使用更健壮的技术。(有专门讨论这个主题的http://htmlparsing.com/,但它没有讨论JS。)
也就是说,下面的代码在Chrome 107和Node 16.13中有效。

(s=>s.match(/(?<=>[^<]*|^[^<]*)specific_string/))
('<a href="something+specific_string" title="testing">This is a text and "specific_string"</a>')

它使用了向后看的方法。你可以使用/(>[^<]*|^[^<]*)(specific_string)/和补偿索引/长度来获得匹配的位置...
当您在注解中回答时,您将替换为用户提供的HTML,我建议您考虑安全问题(即XSS)。
回到解析HTML w/o RegExp的主题上,我们显然在Web浏览器中有这些技术,我无法阻止自己在Web JS中编写一个快速而肮脏的textNode替换器,在Chrome 107中工作:

((html, fun) => {
  const el = document.createElement('body')
  el.innerHTML = html
  const X = new XPathEvaluator, R = X.evaluate('//*[text()]', el)
  const A = []; for (let n; n = R.iterateNext();) A.push(n) // mutating el while iterating XPathResult is illegal
  for (let n of A) fun(n)
  return el.innerHTML})
('<a href="something+specific_string" title="testing">This is a text and "specific_string"</a>',
  n => n.innerHTML = n.innerHTML
    .replace(/specific_string/, '<b>replaced</b>'))

相关问题