Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正则表达式以匹配起始和结束span标记,而不包含其内部文本_Javascript_Regex_Mootools - Fatal编程技术网

Javascript 正则表达式以匹配起始和结束span标记,而不包含其内部文本

Javascript 正则表达式以匹配起始和结束span标记,而不包含其内部文本,javascript,regex,mootools,Javascript,Regex,Mootools,我使用以下正则表达式替换字符串: <\/?(span)\b(?:\s+class="highlight")?> 但是这个正则表达式有一个缺陷。。。以此示例代码为例: <p> Some text here <span class="highlight">This is highlighted</span> <span>This is not highlighted</span> </p>

我使用以下正则表达式替换字符串:

<\/?(span)\b(?:\s+class="highlight")?>

但是这个正则表达式有一个缺陷。。。以此示例代码为例:

<p>
   Some text here
   <span class="highlight">This is highlighted</span>
   <span>This is not highlighted</span>
</p>

这里有一些文字
这是突出显示的
这一点没有突出显示

我的正则表达式将匹配这两个span标记,尽管我只希望其中一个设置为class=“highlight”。如何使用RegEx实现这一点

PS:请不要告诉我,我不应该使用正则表达式,因为我会降低你的答案,因为它是离题的。这是一个关于RegEx的问题

编辑:根据下面接受的答案,我使用下面的正则表达式进行替换 注意:代码使用javascript(mootools)

var regex=new RegExp((]+class\\s*=\\s*(\“|”)高亮显示\\2[^>]*>)(.*?(),'g');
var replaced=element.get('html').replace(regex,“$3”);
元素集('html',已替换);

上面的正则表达式将用“some text here”(不带双引号)替换some text here

您显然是在声明
class=highlight
部分是可选的,方法是在捕获它的组前面放置一个

这应该可以为您做到:

var regex = /(?:<span\s+[^>]*?\s*class\s*=\s*('|")(?:\S+\s+)?highlight(?:\s+\S+)?\1[^>]*>|<\/span>/;

您显然是在声明
class=highlight
部分是可选的,方法是将
放在捕获它的组的前面

这应该可以为您做到:

var regex = /(?:<span\s+[^>]*?\s*class\s*=\s*('|")(?:\S+\s+)?highlight(?:\s+\S+)?\1[^>]*>|<\/span>/;

这应该给予最大的灵活性

(<span[^>]+class\s*=\s*("|')highlight\2[^>]*>)[^<]*(</span>)

(]+class\s*=\s*(“|”)高亮显示\2[^>]*>)[^这将提供最大的灵活性

(<span[^>]+class\s*=\s*("|')highlight\2[^>]*>)[^<]*(</span>)

(]+class\s*=\s*(“|”)突出显示\2[^>]*>)[^只是为了告诉您,替代解决方案不仅可能,而且比使用正则表达式更好:

$$('span.highlight').each(function (node, idx, Elem) {
    var txt = document.createTextNode(Elem.get('text'));
    node.parentNode.replaceChild(txt, node)
});
看这把小提琴:


(这是我最想说的,到目前为止,我对MooTools没有任何接触。可能还有比这更优雅的方法。)

只是想告诉你,替代解决方案不仅可能,而且比使用regex更好:

$$('span.highlight').each(function (node, idx, Elem) {
    var txt = document.createTextNode(Elem.get('text'));
    node.parentNode.replaceChild(txt, node)
});
看这把小提琴:



(这是我的第一次尝试,到目前为止,我对MooTools没有接触过。可能还有比这更优雅的方式。)

你不使用正则表达式来处理HTML。你也不告诉人们不要告诉你这一点,威胁他们投票否决他们的答案。我不希望答案告诉我我不应该使用正则表达式,因为我想用正则表达式解决问题,我在询问之前浏览了stackoverflow,我看到了人们想要正则表达式解决的问题的类似答案。…所以我必须在一些聪明人来回答类似“不要使用正则表达式解析html”的问题之前声明“这显然对社区没有任何帮助。因此,如果你没有regex的答案,那么我对你的解决方案不感兴趣。如果你有,我将投票接受你的答案。对不起,但我不同意。首先,我认为你问这个问题不是为了“帮助社区”,所以这甚至不是一个争论。其次,正则表达式不是解决问题的正确工具,显然你知道。争吵不会改变这一事实。如果你要问这样的问题,你将不得不面对人们会告诉你这一事实。这将有助于“社区”如果人们不再为HTML问题提出有内在缺陷的正则表达式解决方案,那就更重要了,因为如果你坚持使用它足够长的时间,它会起作用。(这让我想问:为什么除了正则表达式之外,没有其他解决方案是不可能的?)你还想到了哪些解决方案?你不使用正则表达式来处理HTML。你也不告诉人们不要告诉你这些,威胁他们投票否决他们的答案。我不希望答案告诉我我不应该使用正则表达式,因为我想用正则表达式来解决问题,我在询问之前浏览了stackoverflow,我看到了关于t问题的类似答案人们想要正则表达式解决方案…所以我必须在一些聪明人到来之前声明,并回答“不要使用正则表达式解析html”这显然对社区没有任何帮助。因此,如果你没有regex的答案,那么我对你的解决方案不感兴趣。如果你有,我会投票接受你的答案。对不起,但我不同意。首先,我不认为你问这个问题是为了“帮助社区”,所以这甚至不是一个争论。其次,正则表达式不是解决问题的正确工具,显然你知道。争吵不会改变这一事实。如果你要问这样的问题,你将不得不面对人们会告诉你这一事实。这将有助于“社区”如果人们不再为HTML问题提出固有缺陷的正则表达式解决方案,那就更重要了,因为只要你坚持使用它足够长的时间,它就会起作用。(这让我想问:为什么除了正则表达式之外,还有其他解决方案是不可能的?)你还想到了哪些解决方案?
(?:xyz)中的
?:
没有指定可选组。去掉?将只匹配正常范围,这不是我想要的…当然不是。
(?:\s+class=“highlight”)?
末尾的问号可以。对,但是为什么说“在前面”?:)我不明白,因为正则表达式是从左到右读取的…但是,没关系。
(?:xyz)
中的
?:
没有指定可选组。去掉?将只匹配正常范围,这不是我想要的…当然不是。
(?:\s+class=“highlight”)?
结尾的问号就可以了。对,那你为什么说“在前面”?:)我不明白,因为正则表达式是从左到右读取的……但是,好吧,没关系。通过阅读问题的标题,你应该注意到@user253530不希望捕获span标记的内部文本,只希望捕获开头和结尾标记本身。你可以简单地删除括号。否则如何匹配结尾标记完全忽略内容?前瞻不会捕获。我知道。但是基于@user253530自己的正则表达式,我们只对开头和结尾标记感兴趣。我发现了这个