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

李惟
  • 2.1k

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

回复
阅读 3.3k
5 个回答
不写代码的码农
  • 12.7k

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

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

弹出false

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

弹出true

李惟
  • 2.1k

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

  • 我的方法是先找出所有<>中的/,将其替换成特定字符(我这里替换的是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库解决此类问题

用户bPcDTY
  • 8k
re = /(?!<)\/(?!>)/;

re.test(" / ");
> true

re.test("<br />");
> false
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏