2012-01-30 96 views
1

我想什么(这是一个静态的CPP只)=>需要一个通用的PHP正则表达式做了preg_replace

$str1 = "<pre    class="brush:cpp">"; 

$temp = preg_replace('/&lt;pre\s+class=&quot;brush:cpp&quot;&gt;/','<pre class="brush:cpp">',$str1); 

echo $temp . "\n"; 

输出=>

<pre class="brush:cpp"> 

但是$ STR1可以

"&lt;pre class=&quot;brush:cpp&quot;&gt;" 
"&lt;pre class=&quot;brush:java&quot;&gt;" 
"&lt;pre class=&quot;brush:php&quot;&gt;" 
"&lt;pre class=&quot;brush:python&quot;&gt;" 

对于那些输出应为=>

<pre class="brush:cpp"> 
<pre class="brush:java"> 
<pre class="brush:php"> 
<pre class="brush:python"> 

注意:我不能使用html_entity_decode,因为文本将包含其他正常字符串,并且&lt;br&gt;对于<br/>,我不想为所有文本执行html_entity_decode。

我需要一个通用的正则表达式来捕捉cpp/java/php/python。我如何编写一个通用的正则表达式来保存模式的一部分,并保持它在替换字符串中。

回答

2

我相信这样的事情会工作:

preg_replace('/&lt;pre\s+class=&quot;brush:(cpp|java|php|python)&quot;&gt;/','<pre class="brush:$1">',$str1); 

它使用一个捕获组捕获其结局是存在,它可以是CPP/JAVA/PHP/Python中的一个。替换是使用反向引用#1进行的,反向引用#1会将捕获的结尾放置到最后。

这是an example

+0

有什么办法避免输入'CPP |的Java | PHP | python'明确?任何方式来为这些写一些通用表达式?这些将是带[a-z]字母的语言/单词。 – shibly 2012-01-30 04:00:35

+0

是的,做'([a-zA-Z] +)'而不是'(cpp | java | php | python)' – nickb 2012-01-30 04:09:15

1

使用

preg_replace('/&lt;pre\s+class=&quot;brush:(.*?)&quot;&gt;/', 
      '<pre class="brush:$1">', 
      $str1);