Php 使用preg_replace屏蔽所有字符,但某些针除外
使用PHP preg_replace和regexPhp 使用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
$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
:或的可选部分。