PHP ..

Ben bu regex oluşturduk

(www|http://)[^ ]+

Bu maç her http://... veya www.... ama ben çalışmak istiyorum preg_replace nasıl bilmiyorum, ben denedim

preg_replace('/((www|http://)[^ ]+)/', '<a href="\1">\1</a>', $str);

ama sonuç boş bir dize, çalışmıyor.

6 Cevap

Eğer ayırıcı olarak eğik çizgi kullanarak çünkü regex bölü kaçmak gerekir. Ayrıca sınırlayıcı olarak başka bir sembol kullanabilirsiniz.

// escaped
preg_replace('/((www|http:\/\/)[^ ]+)/', '<a href="\1">\1</a>', $str);

// another delimiter, '@'
preg_replace('@((www|http://)[^ ]+)@', '<a href="\1">\1</a>', $str);

Sizin asıl sorun parantez her şeyi koyarak bu gibi görünüyor, bu yüzden "\ 1" ne olduğunu bilmiyor. Ayrıca, "/" kaçmak gerekir. Yani bu deneyin:

preg_replace('/(www|http:\/\/[^ ]+)/', '<a href="\1">\1</a>', $str);

Edit: Aslında parantez bir sorun değil gibi görünüyor, ben yanlış anladım. Diğerleri de belirttiği gibi öncelemeli hala bir sorun oldu. Ya çözüm çalışması gerekir.

Diğer kullanıcılar tarafından sağlanan regex kodları kullanırken, vaka-duyarsızlığı etkinleştirmek için "i" bayrak eklemek için emin olun, böylece hem HTTP :/ / ve http:// ile çalışacağız. Örneğin, kaos kodunu kullanarak:

preg_replace('!(www|http://[^ ]+)!i', '<a href="\1">\1</a>', $str);

Diğer yanıtlar açıklandığı gibi her şeyden önce, kaçmak veya daha iyi, yerini-delimeters gerekir.

preg_replace('~((www|http://)[^ ]+)~', '<a href="\1">\1</a>', $str);

İkinci olarak, daha da geliştirmek için düzenli ifade, $n değiştirme referansı sözdizimi manual belirtildiği gibi, \\n tercih edilir.

preg_replace('~((www|http://)[^ ]+)~', '<a href="$1">$1</a>', $str);

Üçüncü olarak, gereksiz tek şey yavaşlatır, yakalama parantez kullanıyor. Bunlardan kurtulun. $1 $0 güncellemek unutmayın. Eğer merak ediyorsanız, bu non-yakalama parantez şunlardır: (?: ).

preg_replace('~(?:www|http://)[^ ]+~', '<a href="$0">$0</a>', $str);

Son olarak, [^ ]+ \s tersi olan, daha kısa ve \S ile daha doğru değiştirmek. [^ ]+ boşluk izin vermediğini unutmayın, ama satırsonlarını ve sekmeleri kabul etmez! \S yok.

preg_replace('~(?:www|http://)\S+~', '<a href="$0">$0</a>', $str);
preg_replace('!((?:www|http://)[^ ]+)!', '<a href="\1">\1</a>', $str);

Eğer desen sınırlayıcı olarak / kullandığınız zaman, desen içinde / sahip iyi çalışmak değildir. Ben desen sınırlayıcı olarak, ancak bunun yerine ters eğik çizgi ile eğik çizgi kaçış olabilir ! kullanarak çözdü.

Ben de iki parantez yakalar yaptıklarını herhangi bir neden görmedim, ben onlardan biri kaldırıldı.

Sizin durumunuzda sorun parçası uyarılar bastırılmış ile çalışıyor konum olduğunu; Eğer error_reporting(E_ALL) üzerine olsaydı, PHP sizin regex sizin sınırlayıcı sorun hakkında üretmek için çalışıyor mesajları görmüş olurduk.

Bir dize, bir yerine bir boşluk, bir satır sonu ayrılmış içerdiği birden fazla url varsa, sen \ S kullanmak zorunda

preg_replace('/((www|http:\/\/)\S+)/', '<a href="$1">$1</a>', $val);