2013-06-27 3 views
1

У меня есть несильно, который Somthing так:Условный строка заменить

function replaceXMLEntities($subject) { 
$subject = str_replace("&", "&", $subject); 
$subject = str_replace("'", "'", $subject); 
$subject = str_replace("<", "&lt;", $subject); 
$subject = str_replace(">", "&gt;", $subject); 
$subject = str_replace("\"", "&quot;", $subject); 

return $subject; 
} 

Эта функция используется для преобразования строк в безопасную строку для кодирования xmpl.

Но у меня есть проблема, в которой casses некоторые GES данные xmpl закодированные в 2 раза, как

&amp; 

, как Imput получает

&&amp; 

Так же, как здесь, когда вы вводите текст без кода quote :)

Мне нужно регулярное выражение, которое могло различать & и & somthing like

if not &amp then do & -> &amp; conversion else dont touch it. 

Любая идея, как я мог бы достичь такого регулярного выражения? Я мог бы пойти и сделать funciton, но в этом случае регулярное выражение, безусловно, лучший вариант.

ответ

1

$subject = preg_replace('#(?!&amp;)&#', '&amp;', $subject);

Хотя с помощью htmlspecialchars() может быть проще ...

1

Вы можете достичь того же без регулярного выражения, заменив все &amp с с & первым:

$subject = str_replace("&amp;", "&", $subject); 
+0

Простой, но Briliant твой: 3 – Sangoku

0

Hardcore путь:

preg_replace('/&(?!#?[a-z0-9]+;)/', '&amp;', '&amp; & &lt; &gt;'); 

Простой и правильный способ использования htmlspecialchars().

0

Довольно просто с помощью preg_replace()регулярное выражение:
$subject = preg_replace('&(?!amp;)', '', $subject);

&: матч &                                                                                             (?!amp;): Отрицательное опережение, проверьте нет amp;

Мы по-прежнему использовать str_replace() для других персонажей, но учтите, что она поддерживает несколько входов/замены, поэтому наш окончательный код будет:

function replaceXMLEntities($subject){ 
    $subject = preg_replace('&(?!amp;)', '', $subject); 
    $subject = str_replace(array("'", '<', '>', '"'), array('&apos;', '&lt;', '&gt;', '&quot;'), $subject); 

    return $subject; 
} 

Вы также можете использовать хитрый способ, сначала заменить все &amp; с &, а затем заменить все & с &amp;:

function replaceXMLEntities($subject){ 
    return str_replace(array('&amp;', '&', "'", '<', '>', '"'), array('&', '&amp;', '&apos;', '&lt;', '&gt;', '&quot;'), $subject); 
}