PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

preg_quote> <preg_match_all
Last updated: Fri, 04 Jul 2008

view this page in

preg_match

(PHP 4, PHP 5)

preg_match — Führt eine Suche mit einem regulären Ausdruck durch

Beschreibung

int preg_match ( string $Suchmuster , string $Zeichenkette [, array &$Treffer [, int $Flags [, int $Versatz ]]] )

Durchsucht Zeichenkette nach Übereinstimmungen mit dem in Suchmuster angegebenen regulären Ausdruck.

Parameter-Liste

Suchmuster

Der Ausdruck nach dem gesucht werden soll als Zeichenkette

Zeichenkette

Die zu durchsuchende Zeichenkette

Treffer

Falls der Parameter Treffer angegeben wurde, wird er mit den Suchergebnissen gefüllt. $treffer[0] enthält dann den Text, der auf das komplette Suchmuster passt, $treffer[1] den Text, der auf das erste eingeklammerte Teilsuchmuster passt und so weiter.

Flags

Flags kann das folgende Flag sein:

PREG_OFFSET_CAPTURE
Falls dieses Flag gesetzt ist, wird mit jeder gefundenen Übereinstimmung der dazugehörige Versatz in der Zeichenkette zurückgegeben. Beachten Sie, dass dies die Rückgabewerte in einem Array dahingehend ändert, dass jedes Element ein Array ist, das aus der übereinstimmenden Zeichenkette mit Index 0 und deren Stelle in Zeichenkette mit Index 1 besteht.

Versatz

Normalerweise beginnt die Suche am Anfang der Zeichenkette. Der optionale Parameter Versatz kann verwendet werden, um eine andere Stelle in Bytes anzugeben, ab der gesucht werden soll.

Hinweis: Die Verwendung von Versatz entspricht nicht der Übergabe von substr($zeichenkette, $versatz) an Stelle der zu Zeichenkette an preg_match(), weil Suchmuster Angaben wie zum Beispiel ^, $ oder (?<=x) enthalten kann. Vergleiche:

<?php
$zeichenkette 
"abcdef";
$suchmuster '/^def/';
preg_match($suchmuster$zeichenkette$trefferPREG_OFFSET_CAPTURE3);
print_r($treffer);
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Array
(
)

während dieses Beispiel

<?php
$zeichenkette 
"abcdef";
$suchmuster '/^def/';
preg_match($suchmustersubstr($zeichenkette,3), $trefferPREG_OFFSET_CAPTURE);
print_r($treffer);
?>

folgende Ausgabe erzeugt

Array
(
    [0] => Array
        (
            [0] => def
            [1] => 0
        )
)

Rückgabewerte

preg_match() gibt die Anzahl der Übereinstimmungen mit Suchmuster zurück. Das ist entweder 0 (keine Übereinstimmung) oder 1, weil preg_match() die Suche nach der ersten Übereinstimmung beendet. Im Gegensatz dazu setzt preg_match_all() die Suche bis zum Ende von Zeichenkette fort. preg_match() gibt FALSE zurück, falls ein Fehler auftrat.

ChangeLog

Version Beschreibung
4.3.3 Den Parameter Versatz hinzugefügt
4.3.0 Das Flag PREG_OFFSET_CAPTURE hinzugefügt
4.3.0 Den Parameter Flags hinzugefügt

Beispiele

Beispiel #1 Die Zeichenkette "php" finden

<?php
// Das "i" nach der Suchmuster-Begrenzung kennzeichnet eine Suche ohne
// Berücksichtigung von Groß- und Kleinschreibung
if (preg_match("/php/i""PHP ist die Web-Scripting-Sprache der Wahl.")) {
   echo 
"Es wurde eine Übereinstimmung gefunden.";
} else {
   echo 
"Es wurde keine Übereinstimmung gefunden.";
}
?>

Beispiel #2 Die Zeichenkette "web" finden

<?php
// Das \b im Suchmuster kennzeichnet eine Wortgrenze, weshalb nur eine
// Übereinstimmung mit der einzelnen Zeichenkette "web" gefunden wird und
// nicht ein Teilwort in "webbing" oder "cobweb"
if (preg_match("/\bweb\b/i""Für das Web ist PHP die Scripting-Sprache der Wahl.")) {
   echo 
"Es wurde eine Übereinstimmung gefunden.";
} else {
   echo 
"Es wurde keine Übereinstimmung gefunden.";
}

if (
preg_match("/\bweb\b/i""PHP ist die Web-Scripting-Sprache der Wahl.")) {
   echo 
"Es wurde eine Übereinstimmung gefunden.";
} else {
   echo 
"Es wurde keine Übereinstimmung gefunden.";
}
?>

Beispiel #3 Den Domänen-Namen aus einer URL holen

<?php
// den Hostnamen aus URL holen
preg_match('@^(?:http://)?([^/]+)@i',
    
"http://www.php.net/index.html"$treffer);
$host $treffer[1];

// die letzten beiden Segmente aus Hostnamen holen
preg_match('/[^.]+\.[^.]+$/'$host$treffer);
echo 
"Der Domänen-Name lautet: {$treffer[0]}\n";
?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

Der Domänen-Name lautet: php.net

Beispiel #4 Benannte Teilsuchmuster (named subpatterns)

<?php

$str 
'foobar: 2008';

preg_match('/(?<name>\w+): (?<zahl>\d+)/'$str$treffer);

print_r($treffer);

?>

Das oben gezeigte Beispiel erzeugt folgende Ausgabe:

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

Anmerkungen

Tipp

Verwenden Sie nicht preg_match(), wenn Sie nur überprüfen wollen, ob eine Zeichenkette in einer anderen Zeichenkette enthalten ist. Verwenden Sie dafür stattdessen die Funktionen strpos() oder strstr(), die das schneller erledigen.



preg_quote> <preg_match_all
Last updated: Fri, 04 Jul 2008
 
add a note add a note User Contributed Notes
preg_match
Dino Korah AT webroot DOT com
09-Jul-2008 01:11
preg_match and preg_replace_callback doesnt match up in the structure of the array that they fill-up for a match.
preg_match, as the example shows, supports named patterns, whereas preg_replace_callback doesnt seem to support it at all. It seem to ignore any named pattern matched.
Tim
08-Jul-2008 05:01
I made a mistake in my previous post. Mail addresses may of course only be "exotic" in their local parts, not in the domain part. Therefore, an exotic mail address would be "exotic#%$mail@domain.com".
Tim
07-Jul-2008 11:51
For those not so familiar with regex's, I post my algorithmic email validation routine. It can more easily be changed for individual needs than regex's. My function does NOT recognize exotic email addresses as allowed by RFC. (For example, info@exotic%&$#mail.com is a legal email address but not allowed by my function.)
-Tim

<?php
function email_is_valid($email) {
   if (
substr_count($email, '@') != 1)
      return
false;
   if (
$email{0} == '@')
      return
false;
   if (
substr_count($email, '.') < 1)
      return
false;
   if (
strpos($email, '..') !== false)
      return
false;
  
$length = strlen($email);
   for (
$i = 0; $i < $length; $i++) {
     
$c = $email{$i};
      if (
$c >= 'A' && $c <= 'Z')
         continue;
      if (
$c >= 'a' && $c <= 'z')
         continue;
      if (
$c >= '0' && $c <= '9')
         continue;
      if (
$c == '@' || $c == '.' || $c == '_' || $c == '-')
         continue;
      return
false;
   }
  
$TLD = array (
        
'COM',   'NET',
        
'ORG',   'MIL',
        
'EDU',   'GOV',
        
'BIZ',   'NAME',
        
'MOBI''INFO',
        
'AERO''JOBS',
        
'MUSEUM'
     
);
  
$tld = strtoupper(substr($email, strrpos($email, '.') + 1));
   if (
strlen($tld) != 2 && !in_array($tld, $TLD))
      return
false;
   return
true;
}
?>
mailinglist dot php at hydras-world dot com
03-Jul-2008 11:30
The regexp below thinks that the e-mail address:

'me@de.com' is invalid, which it is not.

'/^([a-z0-9])(([-a-z0-9._])*([a-z0-9]))*\@
([a-z0-9])([-a-z0-9_])+([a-z0-9])*
(\.([a-z0-9])([-a-z0-9_-])([a-z0-9])+)*$/i'

I modified it and it seems to work for me in my limited tests of it.

YMMV.
brferreira at grad dot ufsc dot br
26-Jun-2008 04:48
Paperweight, this pattern worked fine for me (even for intranet adresses, like "john@localhost"; and also for subdomain emails, like "john@foo.bar.com"):
'/([a-z0-9])([-a-z0-9._])+([a-z0-9])\@
([a-z0-9])([-a-z0-9_])+([a-z0-9])
(\.([a-z0-9])([-a-z0-9_-])([a-z0-9])+)*/i'

but, still, this won't replace the "activation link", that is the better way to check if an e-mail is valid or not.
jonathan dot lydall at gmail dot removethispart dot com
26-May-2008 09:50
Because making a truly correct email validation function is harder than one may think, consider using this one which comes with PHP through the filter_var function (http://www.php.net/manual/en/function.filter-var.php):

<?php
$email
= "someone@domain .local";

if(!
filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo
"E-mail is not valid";
} else {
    echo
"E-mail is valid";
}
?>
Norbert
06-May-2008 02:00
Debian way is:
dpkg-reconfigure locales
Georg
04-Apr-2008 11:36
In addition to reiner-keller's comment about Umlaute using setlocale (LC_ALL, 'de_DE');

To enable 'de_DE' on my Debian 4 machine I first had to:
- uncomment 'de_DE' in file /etc/locale.gen and afterwards
- run locale-gen from the shell

preg_quote> <preg_match_all
Last updated: Fri, 04 Jul 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites