Desen için dize kullanabilirsiniz ama ettirilmesini dışla

4 Cevap php

Ben regex üzerinde, ben arada bir şey öğrendim oldukça yeni değilim, ama yine de bilgi dökmek olduğunu!

Bunu ben nasıl açıklama için size sormak istiyorum!

Eğer onlar diğerinden biraz farklı yolu, bir biçimlendirilmiş olabilir ama onlar çok benzer gördüğünüz gibi ben, şu dizeleri var varsayarak!

DTSTART;TZID="America/Chicago":20030819T000000
DTEND;TZID="America/Chicago":20030819T010000
DTSTART;TZID=US/Pacific
DTSTART;VALUE=DATE

Şimdi i between first A-Z block ve colon, örneğin ben devam ediyorum bu yüzden her şeyi değiştirmek istiyorum

DTSTART:20030819T000000
DTEND:20030819T010000
DTSTART
DTSTART

yani benim çok noobs bilgi üzerine ben bu boktan regex dışarı çalıştı! :-(

preg_replace( '/^[A-Z](?!;[A-Z]=[\w\W]+):$/m' , '' , $data );

ama eminim neden bu regex çalışmayacaktır!? :-)

Pls bana yardım et!

PS: soru başlık oldukça i istiyorum, explaned olduğu zamanda, örneğin maçın başka bir iyi biliyorum dize bloğunu kullanmak biliyorum ...

preg_replace( '/^[DTSTART](?!;[A-Z]=[\w\W]+):$/m' , '' , $data );

.. Delete DTSTART olmadan

Zaman ayırdığınız için teşekkürler!

Regards Luca Filosofi

4 Cevap

Eğer aşağıdaki gibi nispeten basit bir regex kullanabilirsiniz.

$subject = 'DTSTART;TZID="America/Chicago":20030819T000000
DTEND;TZID="America/Chicago":20030819T010000
DTSTART;TZID=US/Pacific
DTSTART;VALUE=DATE';

echo preg_replace('/^[A-Z]+\K[^:\n]*/m', '', $subject) . PHP_EOL;

Bu, bir satırın başında harflerle bir dizi arar maçı başlangıç ​​noktası sıfırlar (ki \K ne) olanların sonuna kadar ve bir şey değil, bir kolon veya satır (yani parça eşleşmeleri ) kaldırmak istiyorum. Uyuşuyordu parçalar daha sonra boş bir dize ile değiştirilir.

Yukarıdan gelen çıktı olur

DTSTART:20030819T000000
DTEND:20030819T010000
DTSTART
DTSTART

İlgilendiğiniz çizgileri sadece hiç DTSTART ile başlayacak veya DTEND sonra (örneğin, ^DT(?:START|END)) maç hakkında daha kesin olabilir ama eğer { [(3)]} tabii ki bunların her ikisini de kapsar.

Eğer bir ikame eşleşen deseninin parçasını korumak istiyorsanız, bunu etrafına parantez koymak ve daha sonra $ 1 (veya hangisi gruplama o) ile ona bakın.

Örneğin:

s/^(this is a sentence) to edit/$1/

"Bu bir cümledir" verir

Siz sorun olarak benzer bu örnek çalışmayı kontrol edebilirsiniz

$str = 'foobar: 2008';

preg_match('/(?P<name>\w+): (?P<digit>\d+)/', $str, $matches);

/* This also works in PHP 5.2.2 (PCRE 7.0) and later, however 
 * the above form is recommended for backwards compatibility */
// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);

print_r($matches);

?>

The above example will output:

Array
(
    [0] => foobar: 2008
    [name] => foobar
    [1] => foobar
    [digit] => 2008
    [2] => 2008
)

u sadece rakam gerekiyorsa u $ eşleşmeleri yazdırmak gerekiyor [rakam]

Bir noktalı virgül ve ya bir kolon veya satır sonuna arasındaki her şeyi kaldırmak istiyor, değil mi? Yani ifadesi olarak kullanmayın. Bir şeyler overcomplicating ediyoruz.

preg_replace('/(?:;.+?:)|(?:;.+?$)/m','',$data);

Bu oldukça basit bir ifadesidir. Ya maç (?:;.+?:) veya (?:;.+?$), (ilk, ikinci bir satır sonuna kadar maçlar, bir kolona kadar maçları) onların sonlandırıcı sadece farklılık göstermektedir.

Her terminatör durur, sonra, bir noktalı virgül ile başlar isteksizce tüm karakterleri okur olmayan bir yakalama grubudur. Bu eşleşmesi Herşey açıklamasına göre çıkarılabilir.