2010-06-12 2 views
0

Я хочу изменитьPHP регулярных выражений для преобразования HTML сущности в соответствующие символы

<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); 
?> 

но это не работает. Как изменить мой код или что-то не так в моем коде?

ответ

4

Там довольно несколько проблем:

  • Pattern 0 имеет * вне группы, поэтому группа соответствует только один символ
  • Pattern 0 не включает в class= группы, а замена тоже не имеет значения, поэтому в замененной строке не будет class=.
  • Узор 0 имеет пробел после класса, но в строке содержимого нет
  • Pattern 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

+1 для объяснения причин, почему оригинал не работает :) – robertbasic

+0

Хранение всего в одной строке '/ < lang ... <\/lang> /' хотя это лучше. Это '112.03%' быстрее, чем разбить его на два массива. –

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; 
?> 
+0

Конечно, это изменит тонны других вещей, которые он не уточнил; 'html_entity_decode' изменяет любой объект html, а не только' <' и '>', а 'str_replace' изменит любой экземпляр' lang', а не только теги –

+0

Я не могу, потому что он содержит некоторый код html. Как этот < языки класса = 'кисти: Xhtml'> <HTML> </html > </языки > Таким образом, я не могу сделать так. – saturngod

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 раз.

Смежные вопросы