Preg_replace yöntemi PHP sözdizimi hatası

4 Cevap php

Ben personalyzed etiketler oluşturabilirsiniz Bir bbcode ayrıştırıcı sınıf yapmak için çalışıyorum, ama ben URL'ler ile biraz problem var

Ben bir sorun olmadan normal ifadeler sayesinde ihtiyacınız olan tüm yaptı ettik ama belirli bir URL'ye işaret özel bir etiket oluşturmak için denediğimde bir sorun var.

Dersimde böyle bir yöntem ekledik:

<?
    private function check_url_from_bbcode ($tag = "url", $css = null, $url_path = null) {
        $regex_url = " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
        if (!isset ($css)) $css = $this->css_link;
        $regex_url = $this->regex_url;
        if (isset ($url_path)) $url_path = "$url_path/";
        $this->bbcode = preg_replace ("/\[$tag\]([$regex_url]*)\[\/$tag\]/", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$1</a>", $this->bbcode);
        $this->bbcode = preg_replace ("(\[$tag\=([$regex_url]*)\](.+?)\[/$tag\])", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$2</a>", $this->bbcode);
    }
?>

kod klasik adresler ile çalışıyor [url] http://ciao.com%5B/url%5D & [URL = http://ciao.com%5Dciao%5B/url%5D

ama ben, bu yüzden [sanatçı] Lemon Jelly [/ sanatçı] last.fm tarzı gibi özel bir url konusu sayfanın dava ile bir sorunum var.

The bblink is converted in < a href="http://ciao.com/artist/Lemon Jelly">Lemon Jelly< /a> (I've used the spaces < a> only to show the link code).
The link has the whitespaces on the href attribute so can't never work.

<?
    private function check_url_from_bbcode ($tag = "url", $css = null, $url_path = null) {
        $regex_url = " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
        if (!isset ($css)) $css = $this->css_link;
        $regex_url = $this->regex_url;
        if (isset ($url_path)) $url_path = "$url_path/";
        // begin of the problem
        $this->bbcode = preg_replace ("/\[$tag\]([$regex_url]*)\[\/$tag\]/", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path".str_replace (" ", "+", $1)."\">$1</a>", $this->bbcode);
        // end of the problem
        $this->bbcode = preg_replace ("(\[$tag\=([$regex_url]*)\](.+?)\[/$tag\])", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$2</a>", $this->bbcode);
    }
?>

Bunu önlemek için, ben "boşluk char" yerine tha aynı url ile değil "+" ile href url bölümünü değiştirmek kod küçük bir kısmını yazmıştım, yani [artist]Lemon Jelly[/artist] {[(1 oldu olmalıdır )]}

PHP ile deneyimli değilim ve ben ettik karşılaşma olmadan başka durumda sorunu bu sözdizimini kullanır, sorunun ne olduğundan emin değilim.

Birisi ben yanılıyorum beni nerede bulmak için yardımcı olabilir?

hata türü PHP Ayrıştırma hatası: T_VARIABLE veya in / '$' bekliyor sözdizimi hatası, beklenmedik T_LNUMBER, ...

4 Cevap

Ayrıştırma hatası $1 geçerli bir PHP değişken adı olmadığı gerçeğinden kaynaklanmaktadır. Onlar bir harf veya alt çizgi ile başlamalıdır. preg_replace parametreleri doldurulur $1 değişken parametreleri içinde sadece geçerlidir.

Daha böyle bir şey deneyin:

$this->bbcode = preg_replace("/\[$tag\]([$regex_url]*)\[\/$tag\]/e", "'<a title=\"Vai al link\" class=\"$css\" href=\"$url_path'. str_replace(' ', '+', '$1'). '\">$1</a>'", $this->bbcode);

İstediğin dize oluşturmak gerekir böylece e değiştirici, PHP kodu olarak değiştirme dizesini değerlendirir.

Note, I can't test it right now, so you may need to tweak it a bit. Sorry :]
Edit Never mind that, I got a hold of a FTP client. Fixed the regex. It works :)

(Satır numarası PHP ayrıştırma hatası olmalı önce ve hata var satırdan sonra 2-3 satır verin.

Bu bir regex sorunu gibi ... more kaçan bir sorun gibi gelmiyor.

Ben oldukça SO, neden ben sadece bu sormak soruya yorumladı olamazdı (i yazdıklarını gibi gerçekten bir cevap değil) yeniyim

Sorunun preg_replace bağımsız değişkenler dışında str_replace fonksiyonunda kullanılan $ 1 referans ile inanıyoruz. 1 $ geribaşvuru sadece preg_replace argümanlar sınırları içinde çalışır, bu yüzden size str_replace bir değişken gibi onu geçemez; bir değişken olarak 1 $ kullanmaya çalışır, ama PHP bir değişken adı için geçersiz.