php - php正则表达式与括号中的字符串不匹配

标签 php regex brackets

我一直在尝试在 php 中使用 preg_replace() 来替换字符串。我想匹配并替换该字符串中的所有 's',但我只提供了解决方案,仅对 'b' 和 'c' 之间的 's' 或 > < 之间的 's' 进行数学运算。有什么方法可以使用负向后查找,不仅适用于字符“>”,而且适用于整个字符串?我不想替换括号中的任何内容。

     <text size:3>s<text size:3>absc
     <text size:3>xxetxx<text size:3>sometehing

编辑: 只需在 >s< 和 bsc 中获取 's' 即可。然后,当我将字符串从“s”更改为“te”时,以替换 xtex 中的“te”和其他内容。所以我正在寻找正则表达式以避免替换 <....>

中的任何内容

最佳答案

您可以使用此模式:

$pattern = '/((<[^>]*>)*)([^s]*)s/';
$replace = '\1\3■';                                      # ■ = your replacement string

$result = preg_replace( $pattern, $replace, $str );

regex101 demo

模式解释:

(               # group 1:
(<[^>]*>)*      # group 2: zero-or-more <...>
)    
([^s]*)         # group 3: zero-or-more not “s”
s               # litterally “s”

如果您希望匹配不区分大小写,请在模式末尾添加“i”:

$pattern = '/((<[^>]*>)*)([^s]*)s/i';

编辑:替换说明

在搜索模式中,我们有 3 个被圆括号包围的组。在替换字符串中,我们可以通过语法 \1 引用组,其中 1 是组编号。

因此,示例中的替换字符串的意思是:将组 1 替换为自身,将组 3 替换为自身,将“s”替换为所需的替换。我们不需要使用组 2,因为它包含在组 1 中(这是由于正则表达式无法检索重复组)。

在演示字符串中:

abs<text size:3>ssss<text size:3><img src="img"><text size:3>absc
└┘╵└───────────┘╵╵╵╵└───────────────────────────────────────┘└┘╵╵
└─┘└────────────┘╵╵╵└──────────────────────────────────────────┘
 1  2            345 6

模式匹配:

     group 1    group 3       s
    ---------  ---------  ---------
1 >     0          1          1
2 >     1          0          1
3 >     0          0          1
4 >     0          0          1
5 >     0          0          1    
6 >     3          1          1

最后一个“c”不匹配,因此不被替换。

关于php - php正则表达式与括号中的字符串不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35880348/

相关文章:

php - 为什么 mysql 从数据中删除斜杠?

php - 模型中的 Laravel 5 验证

php - 创建类似adwords的广告系统

javascript - 从javascript中的字符串中获取数字的正则表达式

c# - 什么时候使用大括号,什么时候不用?

javascript - 使用 jquery 函数选项 textarea 将 php 插入数据库时​​出错

Ubuntu 9.04 中 Sed 命令的正则表达式语法错误

regex - 小数正则表达式,小数点后的数字是可选的

Python解析括号中的 block

html - Outlook 在 HTML 电子邮件中的超链接后在方括号中添加目标 URL