Onları kaçmak için (zaten doğrulanmış olacak) HTML etiketleri dışında çift tırnak tespit edebilirsiniz düzenli ifade "
?
Kullanabilir (veya yazma) bir ayrıştırıcı, bunun için regex kullanmayın.
Aşağıdaki kodu (Eğer belirtildiği gibi) giriş HTML dizesi de oluşmuş olduğunu varsayar. Geçersiz giriş karşılaşırsa kod kıracak uyardı!
Eğer iyi biçimliliğin emin olamaz ise, PHP Tidy bir deneyin verebilir.
<?php
$html = '<tag>text "text"<tag attr="value"><!-- "text" --> text</tag> "text".';
echo html_escape_quotes($html);
/* Parses input HTML and escapes any literal double quotes
in the text content with ". Leaves comments alone. */
function html_escape_quotes($html)
{
$output = "";
$length = strlen($html);
$delim = "<";
$offset = 0;
while ($offset < $length) {
$tokpos = strpos($html, $delim, $offset);
if ($tokpos === false) $tokpos = $length;
$token = substr($html, $offset, $tokpos - $offset);
$offset = $tokpos;
if ($delim == "<") {
$token = str_replace('"', '"', $token);
$delim = substr($html, $offset, 4) == "<!--" ? "-->" : ">";
} else {
$delim = "<";
}
$output .= $token;
}
return $output;
}
?>
Sen dize bölmek ve bu ifade ile metin veri Etiketleri ayırmak için deneyebilirsiniz:
<(?:\?[^?]+\?>|[A-Za-z]+(?:[^">]+|"[^"]*")*|!(?:\[CDATA\[(?:[^\]]+|](?:[^\]]|][^>]))*]]|--(?:[^-]+|-(?!->))*--))>
Bu (umarım) herhangi bir XML PI, eleman etiketi, CDATA ve yorum bloğu maç olacak.
Yani:
$parts = preg_split('/(<(?:\?[^?]+\?>|[A-Za-z]+(?:[^">]+|"[^"]*")*|!(?:\[CDATA\[(?:[^\]]+|](?:[^\]]|][^>]))*]]|--(?:[^-]+|-(?!->))*--))>)/', $str, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
$str = '';
foreach ($parts as $part) {
if ($part[0] == '<') {
$str .= $part;
} else {
$str .= str_replace('"', '"', $part);
}
}
Ama bu çok verimli olduğundan şüpheliyim. Gerçek bir ayrıştırıcı moreefficient ve doğru olacaktır.
Olası.
Sen feryat benzer somethings, regexp ile bunu yapmak mümkün olabilir. Bu regex etiketleri arasında 'sadece 1 "yerine olarak, Tho bunu birden çok kez çalıştırmak zorunda olacak.
Serach: (\<.+?\>.+?)(")(.+?\</.+?\>)
Replace: $1'$3
Ancak, daha iyi bir yaklaşım fonksiyon değiştirme yapmak için geri aramalar kullanmak olacaktır. Sadece o zaman sadece ne istersen "yerine işlevine etiketlerin içeriği gönderir RE oluşturun.
See more info here. Search for callback. As derobert noted, you might need to remove comments before that :)
(Tüm durumlarda değil çalışır) iyi ama benim için yeterince iyi değil:
function quoting(&$data) {
$quot = '(["\x93\x94\x84]|\“|\„|\”|\“|\„|\”|\&quo;|\")';
$parse = '<q>$2</q>';
$data = preg_replace('/="([^"]*)"/', '*%Q:$1%*', $data);
$data = preg_replace("/$quot(.*?)$quot/", $parse, $data);
$data = preg_replace('/\*%Q:(.*?)%\*/', '="$1"', $data);
}