不要在括号php正则表达式中匹配字符串

时间:2016-03-08 23:50:18

标签: php regex brackets

我一直在尝试在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;中的任何内容

2 个答案:

答案 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));