Php 使用preg_replace屏蔽所有字符,但某些针除外

Php 使用preg_replace屏蔽所有字符,但某些针除外,php,regex,Php,Regex,使用PHP preg_replace和regex $string_1 = "leave sb. alone"; $string_2 = "pick one's way forward"; $string_2 = "suffer from sth."; 我需要用指定的字符屏蔽每个字符串,但保留空格、撇号和某些字符串不变,如: $mask_1 = "XXXXX sb. XXXXX"; $mask_2 = "XXXX XXX'X XXX XXXXXXX"; $mask_2 = "XXXXXX XXX

使用PHP preg_replace和regex

$string_1 = "leave sb. alone";
$string_2 = "pick one's way forward";
$string_2 = "suffer from sth.";
我需要用指定的字符屏蔽每个字符串,但保留空格、撇号和某些字符串不变,如:

$mask_1 = "XXXXX sb. XXXXX";
$mask_2 = "XXXX XXX'X XXX XXXXXXX";
$mask_2 = "XXXXXX XXXX sth.";
在这种情况下,我想保留:sb。空格和撇号。 任何帮助都将不胜感激

使用
$mask_1=preg_replace('/(sb.\K)./s',X',$string_1)我只留下“sb”,但空格仍在更改


PS:@Casimir et Hippolyte和@Wiktor Stribiżew的答案都是很好的解决方案,但我接受了Wiktor的跳过失败实现和解释。多谢各位

您可以使用SKIP-FAIL正则表达式:

'~(?:s(?:b|th)\.|[\s'])(*SKIP)(*F)|.~'

详细信息

  • (?:s(?:b | th)\.[\s'])
    -匹配
    s
    ,然后匹配
    b
    sb
    )或
    th
    sth
    ),然后匹配
    或空格或
  • (*SKIP)(*F)
    -省略匹配项,然后从匹配文本的末尾查找下一个匹配项
  • |
    -或
  • -匹配除换行符字符以外的字符(添加DOTALL修饰符以同时匹配换行符字符)

如果需要匹配要保留的整个单词,请不要忘记添加单词边界,
\b
(例如
'~(?:\bs(?:b | th)\.[\s'])(*跳过)(*F).~'
)。

您可以针对所需字符测试此边界:

(?:\G|\b(?!sb\.|sth\.))[[:alnum:]]
(您也可以将
[[:alnum:]
更改为
\w
[^\w\uu]

或者使用
\K
跳过您不需要的字符:

\G(?:\W*(?:\bs(?:b|th)\.)?)*+\K.


在这两种模式中,
\G
确保了连续性。

好的,很好。那么你的问题是什么?您显然希望替换除某些特定字符和某些短语之外的所有字符。做吧。@arkascha谢谢你的建议。谢谢,在regex101.com上看起来很棒,但我无法将它嵌入到php preg_替换中。请告知。@Karls:regex101有一个代码生成器功能,请单击该链接查看您遗漏了什么。分隔符可能是?
$mask\u 1=preg\u replace('/\G(?:\W*(?:\bs(?:b | th)\)*+\K./gs',X',$string\u 1)@NicolasMaltais:是的,没有g.@Casimir et Hippolyte好的,找到了,太棒了,谢谢!现在它的作品。有没有什么简单的方法可以给正则表达式添加更多的例外,比如:“sb's”?谢谢你,也谢谢你的精彩解释。您能告诉我如何添加“sb's”异常吗?将其添加为备选项,或添加为匹配
sb
:或的可选部分。