php - 正则表达式如何匹配不属于模式的单个字符?

标签 php regex regex-negation regex-lookarounds

如果我有一个像这样的字符串:

&#263;; Joh&#263;; 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&#703;;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/

相关文章:

php - 通过插入分隔线防止文本溢出

php - 无法使用 Imagemagick 将 SVG 转换为 WMF

java - Checkstyle 特定方法的多行正则表达式

javascript正则表达式不包含中间的单词

regex - 正则表达式不包括特定的可选后缀

php - 变量在 whereExist 函数内未定义 - laravel

php - Laravel 在所有 api 路由中使用 Web 身份验证重定向到主页

php - preg_replace 不适用于某些单词/字符

具有排除模式的 Java 正则表达式 replaceAll

包含一个字符串但不包含另一个字符串的字符串的正则表达式