WordPress: kusur regex Sorunu

5 Cevap php

Bu WveyadPress "kısa kod" (öznitelikler için diğer bütün etiketi için bir) için kullanılan ifadedir.

return '(.?)\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)';
$pattern = '/(\w+)\s*=\s*"([^"]*)"(?:\s|$)|(\w+)\s*=\s*\'([^\']*)\'(?:\s|$)|(\w+)\s*=\s*([^\s\'"]+)(?:\s|$)|"([^"]*)"(?:\s|$)|(\S+)(?:\s|$)/';

Bu gibi şeyleri ayrıştırır

[foo bar="baz"]content[/foo]

veya

[foo /]

In the WveyadPress trac they say it's a bit flawed, but my main problem is that it don't suppveyat shveyatcodes inside the attributes, like in

[foo bar="[baz /]"]content[/foo]

because the regex stops the main shveyatcode at the first appearance of a closing bracket, so in the example it renders

[foo bar="[baz /]

ve

"]content[/foo]

olduğu gibi gösterir.

Is there any way to change the regex so it bypass any occurrence of [ with ] ve its content when occurs between the opening tag veya self-closing tag?

5 Cevap

I found a way to fix it: First, change the shortcode regex from:

(.?)\[('.$tagregexp.')\b(.*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)

Için:

(.?)\[('.$tagregexp.')\b((?:[^\[\]]|(?R)|.)*?)(?:(\/))?\](?:(.+?)\[\/\2\])?(.?)

Ve sonra wptexturize, tırnak ve pisliği bu düzeltmeyi stilize fonksiyonu ile çatışmayı önlemek için do_shortcode işlevinin önceliğini değiştirmek. Bu biraz sanırım başka yeni fonksiyonu ile sabit oluyor çünkü wpautop ile sorun yok.

Önce:

add_filter('the_content', 'do_shortcode', 11); // AFTER wpautop() 

Sonra:

add_filter('the_content', 'do_shortcode', 9);  

Ben trac bu teslim ve kalıcı bir aradan çeşit üzerinde. Ben çekirdek dosyaları değiştirmeden benim düzeltmeyi uygulamak için bir eklenti yapmak eğer bu arada ben rakam. Filtre öncelik kolay geçersiz kılar, ama ben regex geçersiz nasıl hiçbir fikrim yok.

Amacınız nedir? WordPress 'regex daha iyi olsa bile, kusur idam olmaz.

return '(.?)\[('.$tagregexp.')\b((?:"[^"]*"|.)*?)(?:/)?\](?:(.+?)\[\/\2\])?(.?)';

özelliklerini maçları bit tamamen onlara ne bakılmaksızın dizeleri yakalamak için değiştirildi ilk regex bir çeşididir:

(?:"[^"]*"|.)*?

yerine

.*?

(- Yapılabilir, ama bu gerekli olabilir? Henüz) onlara kaçan alıntı karakterleri ile dizeleri ele unutmayın. Ben WordPress kısa kod için sözdizimi bilmiyorum çünkü ben başka bir şey değişmemiştir.

Gereksiz backslash'lar ve parantezleri kaldırarak biraz temizlenmiş olabilirdi Ama görünüyor:

return '(.?)\[(foo)\b((?:"[^"]*"|.)*?)/?\](?:(.+?)\[/\2\])?(.?)';

Perhaps further improvements are warranted. I'm a bit worried about the unprecise dot in the above snippet, and I'd rather use (?:"[^"]*"|[^/\]])* yerine (?:"[^"]*"|.)*?, but I don't know whether that would break something else. Also, I don't know what the leading and trailing (.?) are good for. They don't match anything in your example so I don't know their purpose.

Eğer bu regex için bir drop-in yerine istiyorsun? Bu bir nitelik değerleri sizin örnekte olduğu gibi etiketleri benzer şeyler içeren sağlar:

'(.?)\[(\w+)\b((?:[^"\'\[\]]++|(?:"[^"]*+")|(?:\'[^\']*+\'))*+)\](?:(?<=(\/)\])|([^\[\]]*+)\[\/\2\])(.?)'

Ya da, daha okunabilir biçimde:

/(.?)              # could be [
 \[(\w+)\b         # tag name
 ((?:[^"'\[\]]++   # attributes
    |(?:"[^"]*+")
    |(?:'[^']*+')
  )*+
 )\]
 (?:(?<=(\/)\])   # '/' if self-closing
   |([^\[\]]*+)   # ...or content
    \[\/\2\]      # ...and closing tag
 )(.?)            # could be ]
/

Anladığım kadarıyla, $tagregexp orijinal tanımlanmış olan tüm etiket isimleri bir değişimlerdir; Ben okunabilmesi için \w+ değiştirmiş. Orijinal regex yakalar her şey, bu bir çok yapar, ve aynı grupta. Tek fark, /, kendi kendine kapanan etiketinde özellikleri hem de kendi grubunda (# 4) ile birlikte grubu no: 3 yakalanır olmasıdır.

Ben diğer regex öznitelik değerleri gömülü etiketleri için tam destek eklemek istemiyorsanız değiştirilmesi gerektiğini sanmıyorum. Bu da bu birinde kaçan tırnak için izin anlamına gelir, ve ben bunu yapmak istiyorum nasıl bilmiyorum. Onları Katlama benim tahminim olurdu; Bu Textpattern nasıl yapar, ve WordPress sözde o dayanmaktadır.

Bu soru WordPress gibi uygulamalar regexes ile uygulamaya olmamalıdır neden iyi bir örnektir. Işlevsellik eklemek ya da değiştirmek için tek yol regexes büyük ve çirkin ve korumak için bile zor hale gereğidir.

This would be nice to fix! I do not have sufficient rep to comment, so I am leaving the following related wordpress trac link, maybe it is the same as the one you meant: http://core.trac.wordpress.org/ticket/14481

Ben herhangi bir düzeltme kusur sözdizimi gibi izin vereceğini umut ediyorum

[Kusur att1 = "val] ue"] içerik [/ kusur]

3.0.1 in $ içeriği ue"]content yerine content olarak yanlış ayrıştırılır beri

Update: regices (? Regexes) öğrenmeye vakit geçirdikten sonra mümkün izin yapılmış] ve Pascal tarzı ile bu argümanları tırnak (''' s [böylece] büyük' ​​örneğin arg =) kaçtı 2 değişiklikler: İlk (get_shortcode_regex) için ilk regex (.*?) grubunu değiştirmek

((?:[^'"\]]|'[^']*'|"[^"]*")*)

(Not: Eğer php kod düzgün şeyi kaçış emin olun) sonra içinde shortcode_parse_atts (ikinci regex içeren işlevi) tekrar (şu, değişim ' {[(2 değiştirin )]} eğer tek tırnak $pattern orijinal kodu gibi)

in $pattern change "([^"]*)" to "((?:[^"]|"")*)"
in $pattern change '([^']*)' to '((?:[^']|'')*)'
$atts[strtolower($m[1])] = preg_replace('_""_', '"', stripcslashes($m[2]));
$atts[strtolower($m[3])] = preg_replace("_''_", "'", stripcslashes($m[4]));

Yine NB: bu seçenek hiç değişti eğer desen değişiklikler böylece eşleşen açgözlü doğası itimat edebilir ve değişti bitleri $pattern (?!"), vb gibi bir şey ile sona gerekebilir