preg_match temelleri soru

5 Cevap php

Got some trouble with my preg_match. The code.

$text = "tel: 012 213 123. mobil: 0303 11234 \n address: street 14";
$regex_string = '/(tel|Tel|TEL)[\s|:]+(.+)[\.|\n]/';

preg_match($regex_string , $text, $match);

Ve ben $ maçta bu sonucu elde [2]

"012 213 123. mobil: 023 123 123"

First question. I want the regex to stop at the .(dot) but it doesent. Can someone explain to why it isnt?

Second question. preg_match uses () to get their match. Is it possible to skip the parentheses surrounding the different "Tel" and still get the same functionality?

D: thnx tüm stackoverflow büyük

5 Cevap

Bu yapmanız gerekir:

/tel(?:\s|:)+([^.]+)(?:\.|$)/i

+ mümkün olduğunca çok karakter eşleşmesi demektir ki, açgözlü bir nicelik olduğunu.

Ikinci soru: bu özel durumda sadece harf duyarsız maçı (i bayrak) kullanmanız gerekir. Genellikle, (?:...) sözdizimi, sen son maçta görebiliyordu örneği de kullanabilirsiniz. Köşeli parantezler karakter sınıfları için kullanılır.

Sadece o çizginin dışına bir telefon numarası ayıklamak için çalışıyoruz, ve 11 numaralar olmasını garanti eğer, sadece bu kullanabilirsiniz:

$text = 'tel: 012 213 123. mobil: 0303 11234';
$phone_number = substr(preg_replace('/[^\d]/', '', $text), 0, 11);`

Sizin örnek ile $phone_number olurdu 0122131230.

Bu nasıl çalışır herhangi bir rakam olmayan çıkarmadan, boş bir dize ile değiştirilir, ve sonra ilk 11 sayı döndürülür olduğunu.

Hiçbir fikrim yok - sizin regex benim için çalışıyor (Ben kodu ile $match[2] in "012 213 123" olsun). Cep telefonu ikisi arasında farklılık olduğu gerçeği gerçekten kod çıkış olmadığını gösteriyor olabilir; tekrar kontrol edin.

Diğer bazı şeyler - Eğer daha uyumlu noktalar var ne varsa (örneğin, "tel:.. Xxx telefon: faks xxx xxx"), kötü sonuçlar alırsınız - açgözlü olmayan operatörleri kullanabilirsiniz ("maçları az parça almak ".*? yerine" ".*) veya tekrarlanan karakterleri sınırlamak maçlar büyük parça almak (" non-dönem herhangi bir sayı "[^.]*). Ayrıca, regex harf duyarsız (Eğer gerçekten "Tel" yazarak insanları nefret sürece) yaparak kendinize sorun yedek olabilir.

Diğer bir soru: (?:stuff) sadece (stuff) gibi "şeyler" maç olacak, ama onu yakalamak olmaz.

Faydalı link: http://www.regular-expressions.info/

Neden karakter sınıfları [\.|\n] ve [\s|:] boruları var? Karakter sınıfları (köşeli parantez içinde şeyler []) OR ilişki gibi, tanımı gereği, yani gerçekten boru eşleştirmeye çalıştığınız sürece ... boru gerekmez |.

Soru # 1 gelince, ben sizin sorununuzu cusiong ne emin değilim, ama genellikle bu açgözlü nicelik ile ilgisi var. (.+) nicelik açgözlü olduğunu, bu yüzden hala tüm desen eşleştirme olurken olarak o kadar eşleşir. Açgözlü nicelik desen onlardan sonra geliyor ne umurumda değil. Bir süre . yeni çizgi karakterler dışında herhangi bir karakterle eşleşir bu yana, bir süre maç, ve bu yüzden bir süre eşleşmiyor. Nicelik yapmak için açgözlü olmayan bir soru işareti ? kullanabilirsiniz.

Senin ikinci soru için RegEx grup şeyler parantez kullanır ve bunları saklamak için. Eğer grup (tel|Tel|TEL) istiyorum ama bunu saklamak değilse $match Eğer açık parantez sonra ?: de koyabilirsiniz:

(?:tel|Tel|TEL)

Eğer only numarasını maç, böylece tel: ve nokta kapalı şerit gerekmez istiyor demek? Bu deneyin:

/tel[:\s]+\K[^.]+/i

i bu harf duyarsız hale getirir.

[:\s], bir kolon ya da boşluk (| anlamına gelmez "ya da" bir karakter sınıfının, sadece bir | eşleşir) eşleşir.

[^.]+, bir veya daha fazla non-nokta maçlar; bunun bir nokta veya çizgi sonunu gördüğünde eşleşen durur, böylece sonucu istemiyorum eğer nokta maç yok.

(Ben biliyorum) Perl ve PHP yalnızca kullanılabilir bir özellik küçük bir taş - Son olarak, \K "Eğer şimdiye kadar eşleşen her neyse unutun ve gerçekten burada başladı maç taklit" anlamına gelir.