2016-03-31 35 views
1

Birisi bana burada neyi yanlış yaptığımı söyleyebilir mi? Ben 527 farklı Itemid arayabilir ve 494 numarayı değiştirmeniz gerekirRegex - Eşit hata ayıklama sorunu çözülmezse değiştirin

/docman/?view=document&alias=690-uchwala-rady-miasta-nr-xv-100-2015-zmieniajaca-uchwale-nr-xxxiii-151-2012&category_slug=gminne-programy-i-strategie&Itemid=123 
/docman/?view=document&alias=690-uchwala-rady-miasta-nr-xv-100-2015-zmieniajaca-uchwale-nr-xxxiii-151-2012&category_slug=gminne-programy-i-strategie&Itemid=494 
/docman/?view=document&alias=690-uchwala-rady-miasta-nr-xv-100-2015-zmieniajaca-uchwale-nr-xxxiii-151-2012&category_slug=gminne-programy-i-strategie&Itemid=527 

: Bu benim örnek verilerdir. (Gerçi g bayrağıyla) öyle,

$pattern = '/(.*)(Itemid=)(?!527)([1-9]*)/'; 
$replacement = "494"; 
$row->text = preg_replace($pattern, '$1'.'$2'.$replacement, $row->text); 

Ve Bu RegExr düzgün çalışmıyor bu

/docman/?view=document&alias=690-uchwala-rady-miasta-nr-xv-100-2015-zmieniajaca-uchwale-nr-xxxiii-151-2012&category_slug=gminne-programy-i-strategie&94= 
/docman/?view=document&alias=690-uchwala-rady-miasta-nr-xv-100-2015-zmieniajaca-uchwale-nr-xxxiii-151-2012&category_slug=gminne-programy-i-strategie&94= 
/docman/?view=document&alias=690-uchwala-rady-miasta-nr-xv-100-2015-zmieniajaca-uchwale-nr-xxxiii-151-2012&category_slug=gminne-programy-i-strategie&Itemid=527 

gibi bir şey alırsınız: Bu benim kodudur.

$row->text = preg_replace($pattern, '$1'.'$2'."WTF?".$replacement, $row->text); 

Ardından düzgün görünmeye başlar ... ama bir bağlantı içinde bu gereksiz WTF vardır:

Şimdi böyle ikinci ifadeden sonra birşeyler eklerseniz

/docman/?view=document&alias=690-uchwala-rady-miasta-nr-xv-100-2015-zmieniajaca-uchwale-nr-xxxiii-151-2012&category_slug=gminne-programy-i-strategie&Itemid=WTF?494 
/docman/?view=document&alias=690-uchwala-rady-miasta-nr-xv-100-2015-zmieniajaca-uchwale-nr-xxxiii-151-2012&category_slug=gminne-programy-i-strategie&Itemid=WTF?494 
/docman/?view=document&alias=690-uchwala-rady-miasta-nr-xv-100-2015-zmieniajaca-uchwale-nr-xxxiii-151-2012&category_slug=gminne-programy-i-strategie&Itemid=527 

ben anlama. Neyi yanlış yapıyorum ve nasıl hata ayıklayabilirim?

$row->text = preg_replace($pattern, '$1'.'${2}'.$replacement, $row->text); 
              ^^^ 

regex demo

bir rakam ile $replacement başlar beri düzenli ifade motoru arıyor bakınız: :(

cevap

1

bu kodu deneyin:

$row->text = preg_replace($pattern, '$1'.'${2}'.$replacement, $row->text); 

o $2 ve 494 katılmadan, bu yüzden ziyade Grup 2., bu arıyordu Capture arıyordu çünkü önceki kod çalışma değildi sebebi Yakalama Grubu # 2494 (4, 494'un ilk hanesidir).Bu Regex101 demo bakarsanız 2

ayrı 494 görmez böylece Yani sorunu önlemek için, sayı civarında {} ilave edersen Yedek bölümün içinde hatayı görebilirsiniz, kırmızı

vurgulanan

yeni Regex101 demo bakarsanız, çalışmaya yeni Substitute görebilirsiniz


Ayrıca, daha kısa ve daha verimli olmak için RegEx değiştirebilirsiniz:

(.*Itemid=)(?!527)(\d*) 

(.*Itemid=) içine (.*)(Itemid=) birleştirin. Bu 0 dahil edilecek istemiyorsanız sürece bu olabilir senin saydırma, ${1}494

Ayrıca ([1-9] yerine, bir rakam seçmek için \d kullanmak anlamına gelir, ama bu size cevapsız Kimliğinizi olabilir başka bir şey senin RegEx)

Regex101 Demo

Sonra

, bunu daha güvenli yapabilir, bu yüzden şu son RegEx ve Değişiklik öneririm:

(.*Itemid=)(?!527$)(\d*)(.*) 
${1}494$3 

Bu böyle, Itemid sonraki URL değişkenleri için izin verir, ...&Itemid=494&Foo=Bar

Ayrıca seçildiği değil

Regex101 Demo

+0

Teşekkür Ederiz Druzion, Eğer bu sizin için uygun değilse, ilk önce @Wiktor cevabını kabul edeceğim? :) –

+0

@ThomasKolasa Sorun değil! Kabul ettiğim gibi kimin cevap verdiğini umursamıyorum, doğal olarak ben de benimkini tercih ederim;), devam et ve kabul et. – Druzion

+0

Vay canına! Bu, şu ana kadar yaptığım en iyi cevap: o: D Btw. Pattern = '/(.*Itemid=)(?!527$)(\d*)(.*) /' içine "$" ekledikten sonra; Aynı zamanda mevcut 527 itemid –

1

kullanın parantez bir kesin şekilde yakalama grubu kimliği tanımlamak için bir yakalama grubu # 24 değeri ($24, 24. yakalama grubu olarak ayrıştırılır) Bunu önlemek için, değiştirme deseninde $'dan sonra grup kimliği çevresinde parantez kullanın veya sorunu tamamen önlemek için adlandırılmış yakalamaları kullanın.

Ben de 527 ile başlayan kimlikleri dışlamak etmemek için desen ((?!527$)) içinde 527 sonra $ eklemenizi öneririz. Ve kesinlikle birine ilk 2 grupları birleştirebilir ve 0 içinde görünecek nerede 206 gibi kimlikleri maç için [1-9] yerine [0-9] kullanın ve [0-9]* gereksiz yakalama grubunu kaldırmak:

(.*Itemid=)(?!527$)[0-9]* 
       ^

ve '${1}'.$replacement ile değiştirin.

+0

den &Itemid=5279 gibi kimlikleri durur yeap bu hata ben yapılmış. Ayrıca \t \t $ pattern = '/(.*)(Itemid=)(?!527$)([1-9]*)/' ekleyerek $; 527 ile eşleşiyor gibi görünüyor. Belki de çok satırlı bir bayrak eklemeliyim? Kontrol etmeliyim. Teşekkür ederim Wiktor. –

+0

@ThomasKolasa: Ne demek istiyorsun * 527 * ile eşleşiyor gibi görünüyor? Demomdan, 'Itemid = 527' ile satırların eşleşmediği açık. Eğer '$' kullanmazsanız, '5277' aynı zamanda uyuşmaz. [This] (https://regex101.com/r/nK1cM5/1) değerini [https://regex101.com/r/nK1cM5/2] desenleriyle karşılaştırın. –

+1

Tamam, deseninizde Druzion'un dikkatinize odaklandığı başka sorunlar var. –