我在将一些正则表达式从preg_match_all中使用转换为在preg_replace中使用时遇到了一些困难。
基本上,仅通过正则表达式,我想匹配前面有空格,文本开头或者超文本的大写字符。这不是问题,我对此有以下效果:
preg_match_all('/(?<= |\A|-)[A-Z]/',$str,$results);
echo '<pre>' . print_r($results,true) . '</pre>';
现在,我想做的是使用preg_replace只返回符合上述条件的大写字符的字符串。如果我将正则表达式直接移植到preg_replace中,那么它显然会替换我想要保留的字符。
非常感谢任何帮助:)
另外,我完全清楚正则表达式在效率方面不是最好的解决方案,但是我想使用preg_replace。
答案 0 :(得分:2)
根据De Morgan's laws,
如果你想保留
A-Z
和[space]
,\A
或-
然后你想删除
字符A-Z
,或 [space]
,\A
或-
也许这个(用空字符串替换匹配)?
/[^A-Z]|(?<! |\A|-)./
请参阅example here。
答案 1 :(得分:1)
我认为会是这样的:
$sString = preg_replace('@.*?(?<= |\A|-)([A-Z])([a-z]+)@m',"$1", $sString);