我一直在尝试在php中使用preg_replace()来替换字符串。我想匹配并替换所有的'在这个字符串中,但我只是带来了解决方案,只有数学和#39;之间' b'和' c'或者' s'之间> &LT ;.有什么方法我可以使用消极的外观,而不仅仅是角色'>'但对于整个字符串?我不想替换括号中的任何内容。
<text size:3>s<text size:3>absc
<text size:3>xxetxx<text size:3>sometehing
编辑: 只是得到了&#39;在&gt; s&lt;在bsc。然后当我改变字符串时,例如来自&#39; s&#39;为了取代&#39; te&#39;在xtex和sometehing。所以我一直在寻找正则表达式以避免替换&lt; ....&gt;中的任何内容
答案 0 :(得分:2)
您可以使用此模式:
$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”不匹配,因此不会被替换。
答案 1 :(得分:0)
使用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));