如果我有一个像这样的字符串:
ć;
Johć; Smith <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a2c8d1e2c1cdcfcfd18cc1cdcf" rel="noreferrer noopener nofollow">[email protected]</a>>;
;boomʿ;woopwoop;
;
并且我希望匹配所有不属于该 html 实体的分号,我可以使用什么正则表达式技术?
我有几次以消极的眼光接近了目标,到目前为止我最好的尝试如下:
(?<!&#.+?[^;]);
然而,这并不符合将胜利带回家所需的所有分号。
我正在使用 PHP。
我正在考虑首先用标记替换 html 实体,然后替换分号,最后将实体替换回字符串中。
这看起来相当笨重和不优雅,所以我宁愿用正则表达式来做,即使它有点笨拙。
编辑:@sln 提供了一个正则表达式,它将选择几乎所有实体,正如他指出的那样,这应该是尝试避免某些事情时的第一步。
(?i)[%&](?:[a-z]+|(?:#(?:[0-9]+|x[0-9a-f]+)));
虽然问题是关于如何选择除字符串中找到的字符之外的单个字符,但我提供的数据上下文使其成为了解并附加到此问题的非常有用的正则表达式。
最佳答案
您可以匹配并跳过实体并在所有其他上下文中匹配分号:
$s = preg_replace('~&#\w+;(*SKIP)(*F)|;~', 'NEWTEXT', $s);
请参阅regex demo
详细信息:
\w+;
-,后跟 1 个以上单词字符和
;
(*SKIP)(*F)
- 两个 PCRE 动词在当前匹配失败,并在文本匹配后继续查找下一个匹配|
- 或;
- 分号。
关于php - 正则表达式如何匹配不属于模式的单个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42538757/