preg_match_all

(PHP 4, PHP 5, PHP 7)

preg_match_allKapsamlı bir düzenli ifade eşleştirmesi yapar

Açıklama

preg_match_all ( string $şablon , string $konu , array &$eşleşmeler [, int $seçenekler [, int $başlangıç ]] ) : int

şablon ile belirtilen düzenli ifadeyi eşleştirmek için konu dizgesinde arama yapar ve bulunanları seçenekler ile belirtilen sırada eşleşmeler dizisine yerleştirir.

İlk eşleşme bulunduğunda arama işlemi bitmez, dizgenin sonuna kadar sürdürülür.

Değiştirgeler

şablon

Bir dizge olarak, aranacak şablon.

konu

Şablonla eşleşeceği düşünülen dizge.

eşleşmeler

seçenekler değiştirgesine göre sıralanmış olarak tüm eşleşenleri içerecek dizi.

seçenekler

Aşağıdaki seçeneklerin bir birleşimi belirtilebilir (Dikkat: PREG_PATTERN_ORDER ve PREG_SET_ORDER birlikte beklenen yararı sağlamaz.):

PREG_PATTERN_ORDER

$eşleşmeler[0] şablonun tamamıyla eşleşen dizgeyi, $eşleşmeler[1] ve sonrakiler alt şablonlarla eşleşen alt dizgeleri içermek üzere sonuçları sıralar.

<?php
preg_match_all
("|<[^>]+>(.*)</[^>]+>|U",
    
"<b>örnek: </b><div align=left>bu bir denemedir</div>",
    
$outPREG_PATTERN_ORDER);
echo 
$out[0][0] . ", " $out[0][1] . "\n";
echo 
$out[1][0] . ", " $out[1][1] . "\n";
?>

Yukarıdaki örneğin çıktısı:

<b>örnek: </b>, <div align=left>bu bir denemedir</div>
örnek: , bu bir denemedir

Böylece, $out[0] şablonun tamamıyla eşleşen dizgeleri içeren bir dizi, $out[1] ise etiketler arasında kalan dizgeleri içeren bir dizi içerir.

PREG_SET_ORDER

$eşleşmeler[0] ilk eşleşme kümesini, $matches[1] ve sonrakiler sonraki eşleşme kümelerini içermek üzere çıktıyı sıralar.

<?php
preg_match_all
("|<[^>]+>(.*)</[^>]+>|U",
    
"<b>örnek: </b><div align=\"left\">bu bir denemedir</div>",
    
$outPREG_SET_ORDER);
echo 
$out[0][0] . ", " $out[0][1] . "\n";
echo 
$out[1][0] . ", " $out[1][1] . "\n";
?>

Yukarıdaki örneğin çıktısı:

<b>örnek: </b>, örnek:
<div align="left">bu bir denemedir</div>, bu bir denemedir

PREG_OFFSET_CAPTURE

Bu seçenek etkin olduğunda, her eşleşme bulunduğunda sonraki arama başlangıcı da döner. Bu durumda, dönen dizinin her elemanı ayrıca birer dizi olup, her elemanın 0 indisinde eşleşen dizge, 1 indisinde ise konu içindeki başlangıç konumunu bulunur.

Bir sıralama seçeneği belirtilmediği takdirde PREG_PATTERN_ORDER öntanımlıdır.

başlangıç

konu dizgesinde aramanın başlatılacağı konum; isteğe bağlı olup bayt cinsinden belirtilir.

Bilginize:

başlangıç değiştirgesinin kullanımı, substr($konu, $başlangıç) ile konu dizgede belirtilen başlangıca göre işleve bir alt dizge aktarmaya eşdeğer değildir. Çünkü, şablon, ^, $, (?<=x) gibi savlar içerebilir. Örnekler için preg_match() işlevine bakınız.

Dönen Değerler

Hata oluşmuşsa FALSE, aksi takdirde şablonun tamamıyla eşleşenlerin sayısını (0 olabilir) döndürür.

Sürüm Bilgisi

Sürüm: Açıklama
4.3.3 başlangıç değiştirgesi eklendi.
4.3.0 PREG_OFFSET_CAPTURE seçeneği eklendi.

Örnekler

Örnek 1 - Bir metinden telefon numaralarının toplanması

<?php
preg_match_all
("/\(?  (\d{3})?  \)?  (?(1)  [\-\s] ) \d{3}-\d{4}/x",
                
"555-1212 veya 1-800-555-1212 numarayı arayın"$teller);
?>

Örnek 2 - HTML etiketlerini bulmak (tamahkarca)

<?php
// \\2 bir geriye gönderim örneği olup PCRE'ye düzenli ifadenin
// ikinci yaylı ayraçlı grubuyla eşleşeceğini söyler; yani ([\w]+) ile.
// Dizge çift tırnak içine alınmış olduğundan çift tersbölü kullanılmıştır.
$html "<b>Vurgulanmış metin</b><a href=howdy.html>buraya tıklayın</a>";

preg_match_all("/(<([\w]+)[^>]*>)(.*?)(<\/\\2>)/",
               
$html$eşleşenlerPREG_SET_ORDER);

foreach (
$eşleşenler as $eşleşen) {
    echo 
" eşleşen: " $eşleşen[0] . "\n";
    echo 
"1. parça: " $eşleşen[1] . "\n";
    echo 
"2. parça: " $eşleşen[2] . "\n";
    echo 
"3. parça: " $eşleşen[3] . "\n";
    echo 
"4. parça: " $eşleşen[4] . "\n\n";
}
?>

Yukarıdaki örneğin çıktısı:

 eşleşen: <b>Vurgulanmış metin</b>
1. parça: <b>
2. parça: b
3. parça: Vurgulanmış metin
4. parça: </b>

 eşleşen: <a href=howdy.html>buraya tıklayın</a>
1. parça: <a href=howdy.html>
2. parça: a
3. parça: buraya tıklayın
4. parça: </a>

Örnek 3 İsimli alt şablon kullanımı

<?php

$konu 
= <<<FOO
a: 1
b: 2
c: 3
FOO;

preg_match_all('/(?<harf>\w+): (?<rakam>\d+)/'$konu$eşleşenler);

    
print_r($eşleşenler);

?>

Yukarıdaki örneğin çıktısı:

Array
(
    [0] => Array
        (
            [0] => a: 1
            [1] => b: 2
            [2] => c: 3
        )

    [harf] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

    [1] => Array
        (
            [0] => a
            [1] => b
            [2] => c
        )

    [rakam] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

    [2] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
        )

)

Ayrıca Bakınız