不匹配方括号 php 正则表达式中的字符串
don't match string in brackets php regex
我一直在尝试在 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 和 sometehing 中的 'te'。所以我正在寻找正则表达式以避免替换 <....>
中的任何内容
使用 preg_match_all
获取所有 s
字母并将其与标志 PREG_OFFSET_CAPTURE
一起使用以获取索引。
正则表达式$pat
包含否定的先行和后行,因此括号表达式中的s
不匹配。
在此示例中,我将 s
替换为字符串 5
。更改为您要替换的字符串:
<?php
$s = " <text size:3>s<text size:3>absc";
$pat = "/(?<!\<text )s(?!ize:3\>)/";
preg_match_all($pat, $s, $matches, PREG_OFFSET_CAPTURE);
foreach ($matches[0] as $match) {
$s[$match[1]] = "5";
}
print_r(htmlspecialchars($s));
您可以使用这种模式:
$pattern = '/((<[^>]*>)*)([^s]*)s/';
$replace = '■'; # ■ = your replacement string
$result = preg_replace( $pattern, $replace, $str );
图案说明:
( # group 1:
(<[^>]*>)* # group 2: zero-or-more <...>
)
([^s]*) # group 3: zero-or-more not “s”
s # litterally “s”
如果要匹配不区分大小写,请在模式末尾添加“i”:
$pattern = '/((<[^>]*>)*)([^s]*)s/i';
编辑:替换说明
在搜索模式中,我们有 3 个用圆括号括起来的组。在替换字符串中,我们可以通过语法 </code> 引用组,其中 <code>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 中使用 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 和 sometehing 中的 'te'。所以我正在寻找正则表达式以避免替换 <....>
中的任何内容使用 preg_match_all
获取所有 s
字母并将其与标志 PREG_OFFSET_CAPTURE
一起使用以获取索引。
正则表达式$pat
包含否定的先行和后行,因此括号表达式中的s
不匹配。
在此示例中,我将 s
替换为字符串 5
。更改为您要替换的字符串:
<?php
$s = " <text size:3>s<text size:3>absc";
$pat = "/(?<!\<text )s(?!ize:3\>)/";
preg_match_all($pat, $s, $matches, PREG_OFFSET_CAPTURE);
foreach ($matches[0] as $match) {
$s[$match[1]] = "5";
}
print_r(htmlspecialchars($s));
您可以使用这种模式:
$pattern = '/((<[^>]*>)*)([^s]*)s/';
$replace = '■'; # ■ = your replacement string
$result = preg_replace( $pattern, $replace, $str );
图案说明:
( # group 1:
(<[^>]*>)* # group 2: zero-or-more <...>
)
([^s]*) # group 3: zero-or-more not “s”
s # litterally “s”
如果要匹配不区分大小写,请在模式末尾添加“i”:
$pattern = '/((<[^>]*>)*)([^s]*)s/i';
编辑:替换说明
在搜索模式中,我们有 3 个用圆括号括起来的组。在替换字符串中,我们可以通过语法 </code> 引用组,其中 <code>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”不匹配,因此未被替换。