2009-12-29 70 views
0

我有一些文字,像这样:的preg_replace或str_replace函数

Paragraphs of text 
(SOME KNOWN TEXT)Unknown Text(SOME OTHER KNOWN TEXT) 
Some additional paragraphs of text 

我要的是保持未知文本,但摆脱(一些已知TEXT)的(SOME其他已知文本)

我认为preg_replace函数会给我我想要的,但我需要的正则表达式替换此:

(SOME KNOWN TEXT)Unknown Text(SOME OTHER KNOWN TEXT) 

与这个..

Unknown Text 

我看到的preg_replace需要3参数正则表达式,替换文字受试者

有没有办法未知文本的值传递给替换文本参数,或者,一个方法来reaplce左,右件(一些已知的文字)(其他一些KNOW TEXT)而不删除未知文本?或者,有没有一个str_replace()解决方案呢?

感谢

--- UPDATE ---

的(有些已知的文本)件可能存在在文本其他地方,但我不希望它删除,除非它遵循(某些已知文本)未知文本(某些其他已知文本)。我在想,最初的str_replace建议不会因此而起作用。

回答

4

有什么条件?如果您有:

(其它一些已知的文本)未知文本(一些已知的文字)

(即如果包围文本交换),你还是想删除它?必须将已知文本始终保存在行首或末尾?如果答案是肯定的,你最好使用正则表达式。事情是这样的:

$new_text = preg_replace('/^\(SOME KNOWN TEXT\)(.+)\(SOME OTHER KNOWN TEXT\)$/m, '$1', $text); 

反斜杠(\)是为了躲避()字符,在正则表达式有特殊的意义。我假设你想改变内容 - 你可以在那个时候删除它们。

在这个正则表达式中,.是一个特殊的操作符,意思是“任何字符”。它会匹配任何字符。 +表示“一个或多个”,并且是前一个操作符的修饰符 - 它们可以一起解释为匹配“一个或多个任何字符”。 ()字符用于捕获subpattern中的文本部分。通过在括号中包含.+,我们捕获这个以用于替换。由()包围的第一部分被正则表达式引擎标记为$1。如果我们有更多,他们将被标记为$2$3,依此类推。

如果这些都不适用,您可以使用其他答案中提到的str_replace函数。

+0

它的工作原理!你能解释1美元是如何填充我想保留的物品的吗? – OneNerd 2009-12-29 16:00:33

+0

它可以工作,但性能较差,所以如果两个不需要的项目在字符串中的其他地方,请确保*不*要*结果。 – Matchu 2009-12-29 16:09:23

+0

@OneNerd:我已经将信息添加到答案中,以及关于'.'和'+'运算符的更多信息的链接。 – 2009-12-29 16:38:40

2

如果两个文本确实是已知的,你可以这样做:

$result = str_replace(array('(SOME KNOWN TEXT)', '(SOME OTHER KNOWN TEXT)'), '', '(SOME KNOWN TEXT)Unknown Text(SOME OTHER KNOWN TEXT)'); 

比正则表达式的性能更好。第一个参数是要替换的一组键,第二个参数是要替换的参数,第三个参数是主题。

3

你可以简单地提供str_replace函数与要删除这样的字符串数组:

$destString = str_replace(array('TEXT A', 'TEXT B'), '', $sourceString); 

如果你不需要任何巧妙的模式匹配,这将是比正则表达式更快的解决方案。