PHP Regular Expression将html实体转换为各自的字符

时间:2010-06-12 09:07:41

标签: php regex

我想改变

<lang class='brush:xhtml'>test</lang>

<pre class='brush:xhtml'>test</pre>

我的代码就是这样。

<?php
$content="&lt;lang class='brush:xhtml'&gt;test&lt;/lang&gt;";
$pattern=array();
$replace=array();
$pattern[0]="/&lt;lang class=([A-Za-z='\":])* &lt;/";
$replace[0]="<pre $1>";

$pattern[1]="/&lt;lang&gt;/";
$replace[1]="</pre>";
echo preg_replace($pattern, $replace,$content);
?>

但它不起作用。如何更改代码中的代码或错误?

3 个答案:

答案 0 :(得分:4)

有很多问题:

  • 模式0在组外部有*,因此该组仅匹配一个字符
  • 模式0不包括组中的class=,替换也没有,因此替换后的字符串中不会有class=
  • 模式0在课后有一个空格,但内容字符串
  • 中没有空格
  • 模式1查找lang而不是/lang

这将有效:

$pattern[0]="/&lt;lang (class=[A-Za-z='\":]*) ?&gt;/";
$replace[0]="<pre $1>";

$pattern[1]="/&lt;\/lang&gt;/";
$replace[1]="</pre>";

答案 1 :(得分:2)

没有正则表达式怎么回事? :)

<?php
$content="&lt;lang class='brush:xhtml'&gt;test&lt;/lang&gt;";
$content = html_entity_decode($content);
$content = str_replace('lang','pre',$content);
echo $content;
?>

答案 2 :(得分:1)

使用preg_replace比str_replace快得多。

$str = preg_replace("/&lt;lang class=([A-Za-z'\":]+)&gt;(.*?)&lt;\/lang&gt;/", "<pre class=$1>$2</pre>", $str);
Execution time: 0.039815s

[preg_replace]
  Time: 0.009518s (23.9%)

[str_replace]
  Time: 0.030297s (76.1%)



Test Comparison:

[preg_replace]
  compared with.........str_replace     218.31% faster

因此preg_replace比上面提到的218.31%方法快str_replace。每次测试1000次。