需要一个通用的php正则表达式来做preg_replace

时间:2012-01-30 03:49:49

标签: php regex preg-replace

我尝试过的(仅限cpp的静态)=>

$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";

那输出=&gt;

<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;"

对于那些输出应该是=&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 个答案:

答案 0 :(得分: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进行的,它将放置捕获的结尾。

这是an example

答案 1 :(得分:1)

使用

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