请教正则如何匹配不被<>包含的/?

我想要匹配数据中所有的/,但是需要去掉<>中的/,例如:<br />,还有</a>,请问怎么匹配?

阅读 4.3k
5 个回答

可以试试正向否定查找:/\/(?!>)/表示匹配一个/仅当其后面不跟>的时候

var re = /\w+\/(?!>)/;
alert(re.test("sdasd/>"))

弹出false

var re = /\w+\/(?!>)/;
alert(re.test("sdasd/sdsasd>"))

弹出true

我自己想出一个解决办法,有点绕,但是是目前唯一能解决问题的办法。如果大家有更好的方法,希望能够指教并回复,谢谢。

  • 我的方法是先找出所有<>中的/,将其替换成特定字符(我这里替换的是urlencode后的字符)
  • 之后对/进行替换
  • 最后将其还原

PHP代码如下:

$str = preg_replace('/<([^<>]*)\/([^<>]*)>/is', '<$1%2F$2>', '</a>badafa/<br />/89892 / dafdf/ a

<hr />

</a>');

$str = str_replace('/', '//', $str);
var_dump(str_replace('%2F', '/', $str));

我的方法分了两个步奏,先将所有尖括号内的所有内容替换为空,再匹配所有斜杠

str='<\a>badafa/<br />/89892/dafdf/a<hr />';
newStr=str.replace(/<[^>]*>/g,"");  OUTPUT: "badafa//89892/dafdf/a"
newStr.match(/\//g); OUTPUT: ["/", "/", "/", "/"]

是不是分两个步奏把这个问题复杂化了? - -

目测八成的正则悲剧都起源于希望让正则理解DOM……

多数语言都有足够好的DOM/XML库解决此类问题

re = /(?!<)\/(?!>)/;

re.test(" / ");
> true

re.test("<br />");
> false