正则表达式捕获并替换html标记之外的文本模式

时间:2014-10-27 03:34:20

标签: javascript jquery html regex

我有一些字符串,如" de456" " us7515",它是de / us和3到10位数。

我希望捕获所有这些并用超链接替换它们,除非它们已经在html标记内。

示例:

  1. 应该改变:

    <div> de485 </div> => <div> <a href = "xxx.com/de485">de485</a></div>
    <span> i need us1234 </span> => <span> i need <a href = "xxx.com/us1234"> us1234 </a></span>
    
  2. 不应该改变:

    <a href ="github.com/xxxxx/us1234> link </a> => <a href ="github.com/xxxxx/us1234> link </a>
    
  3. 应该部分改变

    <a href ="github.com/xxxxx/us1234> us1234 </a> => <a href ="github.com/xxxxx/us1234> <a href = "xxx.com/us1234"> us1234 </a> </a>
    
  4. 我已经写了两个正则表达式:

    匹配文字模式:

    de456
    us1234
    
    /\b(us\d{3,10}|de\d{3,10})\b/ig
    

    匹配open html标签内的文本模式

    <a href = "github.com/de456">
    
    /<\s*\w.*\b(us\d{3,10}|de\d{3,10})\b.?>/ig
    

    所以我可以使用jquery regex exec和string.replace来做1和2,但我不知道怎么做3。 请指教。非常感谢你提前。

2 个答案:

答案 0 :(得分:1)

我试试这个。如有必要请采取。

(?<![\/])((?:de|us)[0-9]{3,10})

查看演示: http://regex101.com/r/oS0tS3/2

答案 1 :(得分:0)

以下示例足够接近,但是,我不建议在实际应用中执行此操作。

// matches all 3 cases
var pattern = /([^/])((us|de)\d+)/ig;

/* 1 */
'<span> i need us1234 </span>'.replace(pattern, '$1<a href="xxx.com/$2">$2</a>');
//=> "<span> i need <a href="xxx.com/us1234">us1234</a> </span>"

/* 2 */
'<a href ="github.com/xxxxx/us1234> link </a>'.replace(pattern, '$1<a href="xxx.com/$2">$2</a>');
//=> "<a href ="github.com/xxxxx/us1234> link </a>"

/* 3 */
'<a href ="github.com/xxxxx/us1234> us1234 </a>'.replace(pattern, '$1<a href="xxx.com/$2">$2</a>');
//=> "<a href ="github.com/xxxxx/us1234> <a href="xxx.com/us1234">us1234</a> </a>"