Özel URL'ler ile PHP preg_replace garabeti

4 Cevap php

I <a> etiketleri geride <span> etiketleri eklemek için aşağıdaki kodu kullanıyorum.

$html = preg_replace("~<a.*?href=\"$url\".*?>.*?</a>~i", "$0<span>test</span>", $html);

Kod düzenli bağlantıları (yani http://www.google.com/) için iyi çalışıyor, ama $ url içeriği $link$/3/ olduğunuzda bir yerini gerçekleştirmez.

Bu (mis) davranışı göstermek için örnek kod:

<?php
    $urls = array();
    $urls[] = '$link$/3/';
    $urls[] = 'http://www.google.com/';

    $html = '<a href="$link/3/">Test Link</a>' . "\n" . '<a href="http://www.google.com/">Google</a>';

    foreach($urls as $url) {
        $html = preg_replace("~<a.*?href=\"$url\".*?>.*?</a>~i", "$0<span>test</span>", $html);
    }

    echo $html;
?>

Ve bu ürettiği çıktı:

<a href="$link$/3/">Test Link</a>
<a href="http://www.google.com/">Google</a><span>test</span>

4 Cevap

$url = preg_quote($url, '~'); dolar işaretleri her zamanki gibi yorumlanır: end-of-girişi.

just somebody doğrudur; onları birebir olarak yorumlanabilir için ne demek eğer özel regex karakterler kaçmak gerekir.

Bir eşleşme yapar asla çünkü yerini yapamazsınız gibi o da bana bakıyor.

Bu satırı değiştirmeyi deneyin:

$urls[] = '$link$/3/';

Bu grubu:

$urls[] = '$link/3/';

$ özel bir regex karakter olarak kabul ve kaçtı edilmesi gerekiyor. preg_replace() geçirmeden önce preg_quote() to escape $url kullanın.

$url = preg_quote($url, '~');

$ Regex özel bir anlamı vardır. Satır sonu. Sizin ifadesi şu şekilde genişletilmiş ediliyor:

$html = preg_replace("~<a.*?href=\"$link$/3/\".*?>.*?</a>~i", "$0<span>test</span>", $html);

Ki bu satırları iki ucu arasında "bağlantı" bulamıyorum çünkü başarısız olur. $ URL'ler dizisindeki $ kaçan deneyin:

$urls[] = '\$link\$/3/';