Iki dizeleri dışında gerçekleşir sadece metni değiştirmek için Regex?

3 Cevap php

Ben "<" ile "& lt" yerine "& gt" ile ">" ve istiyorum ama onlar dışarıda "

" ortaya çıkar ve "" sadece. Bu mümkün mü?

$newText = preg_replace('&gt', '>', $text);

Ben yukarıdaki gibi PHP preg_replace kullanarak olacaktır.

3 Cevap

Eğer bir regex ile yapmak istiyorsanız, hile regex siz de değiştirmek istediğiniz şeyleri değiştirmek istemiyorum şeyler maç ve dinamik eşleşen ne bağlı olarak değiştirme hesaplamak yapmaktır.

$new_text = preg_replace_callback('%&lt;|&gt;|<pre>.*?</pre>%si', compute_replacement, $text);

function compute_replacement($groups) {
    if ($groups[0] == '&lt;') {
      return '<';
    } elseif ($groups[1] == '&gt;') {
      return '>';
    } else {
      return $groups[0];
    }
}

Bir regex istedi, ama ben sadece bunu yapmak için gerçekten kirli bir fonksiyon yazdım, çünkü bu gerçekten bir cevap değildir:

<?php

$html = ' <pre>hello &gt; &lt;</pre>
            &gt; &lt;
            <pre></pre>';


function stringReplaceThing($str) {
    $offset = 0;
    $num = 0;
    $preContents = array();
    $length = strlen($str);

    //copy string so can maintain offsets/positions in the first string after replacements are made
    $str2=$str;

    //get next position of <pre> tag
    while (false !== ($startPos = stripos($str, '<pre>', $offset))) {
        //the end of the opening <pre> tag
        $startPos += 5;

        //try to get closing tag
        $endPos = stripos($str, '</pre>', $startPos);

        if ($endPos === false) {
            die('unclosed pre tag..');
        }

        $stringWithinPreTags = substr($str, $startPos, $endPos - $startPos);
        //replace string within tags with some sort of token
        if (strlen($stringWithinPreTags)) {
            $token = "!!T{$num}!!";
            $str2 = str_replace($stringWithinPreTags, $token, $str2);
            $preContents[$token] = $stringWithinPreTags;
            $num++;
        }

        $offset = $endPos + 5;
    }

    //do the actual replacement
    $str2 = str_replace(array('&gt;', '&lt;'), array('>', '<'), $str2);

    //put the contents of <pre></pre> blocks back in
    $str2 = str_replace(array_keys($preContents), array_values($preContents), $str2);
    return $str2;
}


print stringReplaceThing($html);

PHP'nin regex motoru negatif lookarounds yaparsa emin hazırlıksız değilim, ama ne diğer dillerde regex ilgilendiğiniz gibi görünecektir bulunuyor:

/(?<!(<pre>[^(<\/pre>)]*))XXX(?!(.*<\/pre>))/

(Nefes - I think Ben bu doğru var)

XXX "<" Desen nerede ya da ">"

nb. büyük olasılıkla çok daha basit bir desen var neler