Bu Düzenli İfade ne yapar

9 Cevap php
$pee = preg_replace( '|<p>|', "$1<p>", $pee );

Bu düzenli ifade Wordpress kaynak kodu (formatting.php, wpautop işlevi) dan; Ben ne yapar emin değilim, herkes yardımcı olabilir?

Aslında Python port için bu işlevi çalışıyorum ... Herkes zaten varolan bir liman bilen varsa ben regex gerçekten kötü olduğum gibi, çok daha iyi olurdu.

9 Cevap

wordpress gerçekten bir değişken "işemek" dediği?

Ben $ için 1 standları (hayır parantez ilk parametre vardır?), Bu yüzden aslında bir şey yok sanmıyorum ne emin değilim, ama yanlış olabilir.

Preg_replace () fonksiyonu - biraz kafa karıştırıcı - Bunu, normal ifadeler için standart "/" dışında diğer ayraçları kullanmanızı sağlar

"|<p>|"

Sadece eşleşen bir düzenli ifade olurdu

"<p>"

Metinde. Ancak, ben ne yedek parametre net değilim

"$1<p>"

$ 1 haritasına gruplama beri var, yapıyor olurdu. Bu verilen, bu sadece bir paragraf etiketi ardından boş bir dize ile bir paragraf etiketi değiştirme ve yürürlükte şey yapıyor gibi görünüyor.

PHP tuhaflıklar daha derinlemesine bilgisi olan herkes daha iyi bir analiz var?

Boru sembolleri "|" Bu durumda varsayılan anlamı yok "bu maç ya da" ama bunun yerine daha yaygın bölü "/" desen için alternatif ayraç olarak kullanımı vardır. Bu, mantıklı olabilir Eğer "/" bu çıkmaz, (örneğin kaçmak zorunda kalmadan "/ (. *) \ / (. *) \ / /" "# / (Gibi okunabilir değildir. *) Için maç istiyorum / (. *) / # "). Ama yerine, desen için sadece başka ayrılmış karakter olan "|" kullanmak oldukça doğurganlık aleyhine görünüyor.

Yedek desen normalde 1 $ parantez ile gösterilen ilk grubu eşleşmesi gerekir. Örneğin bir desen gibi var ise

"(.*)<p>"

$ 0

önce bütün maçı ve 1 $ kısım içerecektir.

Verilen reg-ex hiçbir gruba beyan etmez ve 1 $ yerde tanımlanan (PHP4) bir değişken için geçerli bir ad değil, bu çağrı

herhangi tekrarlarını yerine görünüyor

ile?

Dürüst olmak gerekirse, şimdi ben de oldukça kafam karıştı. Sadece bir tahmin: başka bir desen eşleştirme yöntemi (preg_match ve benzeri) Verilen satırdan önce çağrılır böylece "$ 1" oradan "sızdırılmış" nedir?

? ...

Bu ilk <p> etiketini alır ve ona önceki düzenli ifadenin ilk maçı slash konulur (hiçbir maç bu birinde var bu yana), gibi aslında görünüyor

* Işlevleri kendi değerleri ile 1 $ benzetecek olmaz preg_ hiçbir garantisi var gibi Ancak, bu davranış az söylemek kötü olduğunu görünüyor.

Edit: Jay'in Yorumlarınız bakılırsa, bu regex aslında hiçbir şey yapmaz.

Ben son derece şaşırtıcı RegexBuddy öneriyor

Bu çizginin bir şey yok inanıyorum.

Bu değer ne için, bu $ 1 set edildiği önceki satırı olduğunu:

$pee = preg_replace('!<p>([^<]+)\s*?(</(?:div|address|form)[^>]*>)!', "<p>$1</p>$2", $pee);

Ancak, bu değer bir şey olduğunu sanmıyorum. Sonraki $ 1 için kendi değerini ayarlayın olmasa bile benim test, 1 $, bir preg_replace dan sonraki bir değer tutmaz. , Yani 1 $ PHP değişken değil: PHP değişken isimleri (http://php.net/language.variables bakınız) bir sayı ile başlayamaz unutmayın. Bu tek bir preg_replace içinde bir şey anlamına gelir ve bu durumda preg_replace kuralları bu hiçbir şey demek değil öneririz.

O dedi, böyle bir yaygın kullanılan fonksiyonu olan AUTOP bana bu hat şey yapıyor benim kendi sonucu şüphe yapar. Yani beni düzelten birisi için sabırsızlanıyoruz.

Regex sadece edebi metin

eşleşir. Bölü yerine forvet dikey çubuk regex sınırlandırmak için seçim çok talihsiz bir durumdur. Bu kodu değişmiyor, ama bu insanlar okumak için zor hale getirir. (O da imkansız regex münavebe operatörünü kullanmak için yapar.)

1 $ PHP, geçerli bir değişken adı değil, yani $ 1 çift tırnakla interpolasyona asla. 1 $ değişmeden preg_replace iletilir. preg_replace değiştirme dizesini ayrıştırır ve ilk yakalama grubu içeriği ile 1 $ değiştirir. Herhangi bir yakalama grubu olması halinde, 1 $ hiçbir şey ile değiştirilir.

Böylece, bu kod ile aynı işi yapar:

$pee = preg_replace( '/<p>/', "<p>", $pee );

Bu hiçbir şey yok bu doğru değil. Arama ve değiştirme yazılım yavaşlatan, ve $ çiş geçici kopyaları için bellek kadar yeme, çalışacaktır.

Ben RegEx'in ile çok fazla deneyimim yok, bir atm bana bir RegEx test aracı yok ama bazı arama yapıyor ve diğer WordPress kaynak kodu ve yorumlarına baktıktan sonra, bu kod yinelenen paragraf etiketleri kaldırır ve onları wih yerine mümkün etiketleri tek bir set.

Bu desen maç değiştirin

"|<p>|"

dizesiyle

"$1<p>"

| Değiştirme desen düzenli ifade motor sağ tarafında, sol tarafında bir parçası, ya da bir kısmını ya da uygun neden olur.

Genellikle "ta (b | p) e" gibi bir şey, çünkü bu şekilde kullanılır neden alamadım ...

1 $ için, ben değişken $ 1 PHP kodu olduğunu ve eğer öyleyse 1 $ = "test" preg_replace sırasında değiştirilmesi sanırım; değiştirme yerini alacak

"<p>"

karşı

"test<p>"

Ama ben 1 $ için ondan emin değilim