2012-04-25 53 views
3

我在将preg_match_all中使用的某些正则表达式转换为在preg_replace中使用时遇到了一些困难。PHP正则表达式帮助(从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

你可以简单地将你的正则表达式的否定变成preg_replace吗? – Ina 2012-04-25 20:05:59

+0

@Ina你的意思是在正则表达式中增加一个(!)如果是这样,我试过了,但是因为后面的效果,效果不一样 – 2012-04-25 20:17:58

回答

2

De Morgan's laws,如果你想保留那些

  • A-Z字母
  • 前面加[space]\A-

那么你想删除的

  • A-Z
  • 通过[space]之前,\A-

也许这角色(用空字符串替换匹配)?

/[^A-Z]|(?<! |\A|-)./ 

参见example here

+0

这是完美的,所以它现在匹配非AZ,然后对未前置字符由那些角色。 非常感谢您对此的帮助:) – 2012-04-25 20:32:17

1

我认为这将是这样的:

$sString = preg_replace('@.*?(?<= |\A|-)([A-Z])([a-z]+)@m',"$1", $sString); 
+0

嗨,安东,谢谢你的回复。删除我想保留的字符 – 2012-04-25 20:13:51

+0

您可以发布测试文本吗?:)通过一些示例可以更容易地为您提供帮助。 – Anton 2012-04-25 20:14:44

+0

$ str =“这是一个测试字符串和东西”; 当然,这是我正在使用的测试字符串,并且使用preg_match_all,它将返回TIATSAS,并且我想使用preg_replace来保留这些字符 – 2012-04-25 20:15:50