查找并替换引号内的文本忽略html标记

时间:2014-09-09 10:56:51

标签: javascript jquery regex

我有HTML标签的简单文本和引号中的一些文本我想在引号内的文本上添加span。例如:

<p>A quick "brown" fox "jumps" over <a href="www.gamescottage.com">the</a> lazy dog.</p>

我想要的是将这一行改为:

<p>A quick "<span>brown</span>" fox "<span>jumps</span>" over <a href="www.gamescottage.com">the</a> lazy dog.</p>

我正在使用此代码执行此操作:

<script>
    $('document').ready(function (){
        var text = $('p').html();
        text = text.replace(/"(.*?)"/g, '"<span class="quote">$1</span>"');
        $('p').html(text);
     });
</script>

但它取代了HTML锚标记的引用以及任何解决方案? 简而言之,我只想在引号内添加span,忽略HTML标记的引号。

3 个答案:

答案 0 :(得分:5)

JavaScript已经为你构建了一个内置的DOM解析器 - 而不是试图用正则表达式解析HTML本身很困难且边缘不可能 - 你可以使用DOM为你带来的内置功能。在你的情况下,我将使用jQuery演示它,但非jQuery解决方案同样简单:

$("p"). // all p tags
contents(). // select the actual contents of the tags 
filter(function(i,el){   return el.nodeType === 3; }). // only the text nodes
each(function(i, el){ 
    var $el = $(el); // take the text node as a jQuery element
    var replaced = $el.text().replace(/"(.*?)"/g,'<span>"$1"</span>') // wrap
    $el.replaceWith(replaced); // and replace
});

Here's a fiddle

答案 1 :(得分:0)

从你的代码中我假设你擅长正则表达式和脚本。这是一个算法,使用它可以编写代码。

在用当前代码替换文本后用

替换文本,获取结果字符串并检查打开的html标记内是否存在任何span标记(例如:<a ... <span>)并替换整个HTML来自原始String的实体。通过这种方式,您可以实现您的需求。

注意:我曾经在Java中做过同样的事情我现在没有这个代码片段

希望这有助于你

答案 2 :(得分:0)

您可以分三个步骤执行此操作:

  1. 使用标记暂时替换HTML标记中的引号
  2. 为任何剩余的引号添加范围
  3. 恢复任何标记的引号
  4. 第1步:

    text = text.replace(/([^>"]*)"(?=[^<]*>)/g, '$1#Q#');

    这使用预测来查看在下一个>之前引号是否跟<

    第2步:

    text = text.replace(/"(.*?)"/g, '<span class="quote">$1</span>');

    第3步:

    text = text.replace(/#Q#/g, '"');