Altijd lastig: Regular Expressions, of kortweg RegEx. Voor mezelf in dit stukje met een paar voorbeelden met bijbehorende uitleg.
Youtube
^(.+)([/]watch[?]v=)(?<key>(.+))$|^(http)(s)?[:][/]{2}youtu[.]be[/](?<key>(.+))$
Allereerst staat ergens middenin een pipe-teken (|). dat geeft aan dat deze RegEx zoekt naar twee verschillende patronen. Anders gezegd zijn er twee patronen toegestaan:
^(.+)([/]watch[?]v=)(?<key>(.+))$ en ^(http)(s)?[:][/]{2}youtu[.]be[/](?<key>(.+))$
Ik begin bij de linker. Deze zoekt naar een patroon zoals http://www.youtube.com/watch?v=m5fNKbNuCBI
. zoekt één willekeurig teken.
.+ zoekt tenminste één willekeurig teken
^(bla) zoekt een tekst dat begint met “bla”.
^(.+) is dus een tekst die begint met een willekeurig aantal willekeurige tekens.
daarna staat ([/]watch[?]v=). Dus na ^(.+) wordt naar “/watch?v=” gezocht. Het maakt dus niet uit wat er voor /watch?v= staat. De slash en het vraagteken kunnen iets anders betekenen en staan dus expliciet tussen rechte haken.
(bla)$ zoekt naar bla op het einde van een tekst. Dus (.+)$ zoekt naar willekeurige tekens op het eind. De (?<key>(.+)) geeft aan dat we dit deel ‘opvangen’ in variabele ‘key’.
Dan het rechter deel. Deze zoekt naar een patroon zoals http://youtu.be/m5fNKbNuCBI
^(http)(s)?[:][/]{2}youtu[.]be[/](?<key>(.+))$
Zoekt naar tekst dat begint met ‘http’. (s)? betekent 0 of één keer ‘s’. dan moet er een dubbele punt staan, dan 2 x een slash en daarna ‘youtu.be/’ (de punt en slash moeten expliciet). Het einde komt overeen met het einde van het eerste deel.
Gebruik in PHP
In PHP ziet RegEx er iets anders uit. verschillen:
^ aan het begin wordt / en $ op het einde wordt ook /
Tekens die iets anders kunnen betekenen worden ge-escaped met \
Dus [/] wordt \/
Variabelen gaan niet zo ?<key> maar zo ?P<key>
Voorbeeld:
<?php
$str = ‘http://youtu.be/hAlLoDaAr’;
preg_match(‘/(.+)youtu.be\/(?P<key>(.+))/’, $str, $matches);
print($matches[key]);
?>
Dit geeft ‘hAlLoDaAr‘ in beeld.
Modifier |
Description |
i |
Perform case-insensitive matching |
g |
Perform a global match (find all matches rather than stopping after the first match) |
m |
Perform multiline matching |
Expression |
Description |
[abc] |
Find any character between the brackets |
[^abc] |
Find any character not between the brackets |
[0-9] |
Find any digit from 0 to 9 |
[A-Z] |
Find any character from uppercase A to uppercase Z |
[a-z] |
Find any character from lowercase a to lowercase z |
[A-z] |
Find any character from uppercase A to lowercase z |
[adgk] |
Find any character in the given set |
[^adgk] |
Find any character outside the given set |
(red|blue|green) |
Find any of the alternatives specified |
Metacharacter |
Description |
. |
Find a single character, except newline or line terminator |
\w |
Find a word character |
\W |
Find a non-word character |
\d |
Find a digit |
\D |
Find a non-digit character |
\s |
Find a whitespace character |
\S |
Find a non-whitespace character |
\b |
Find a match at the beginning/end of a word |
\B |
Find a match not at the beginning/end of a word |
\0 |
Find a NUL character |
\n |
Find a new line character |
\f |
Find a form feed character |
\r |
Find a carriage return character |
\t |
Find a tab character |
\v |
Find a vertical tab character |
\xxx |
Find the character specified by an octal number xxx |
\xdd |
Find the character specified by a hexadecimal number dd |
\uxxxx |
Find the Unicode character specified by a hexadecimal number xxxx |
Quantifiers
Quantifier |
Description |
n+ |
Matches any string that contains at least one n |
n* |
Matches any string that contains zero or more occurrences of n |
n? |
Matches any string that contains zero or one occurrences of n |
n{X} |
Matches any string that contains a sequence of X n’s |
n{X,Y} |
Matches any string that contains a sequence of X to Y n’s |
n{X,} |
Matches any string that contains a sequence of at least X n’s |
n$ |
Matches any string with n at the end of it |
^n |
Matches any string with n at the beginning of it |
?=n |
Matches any string that is followed by a specific string n |
?!n |
Matches any string that is not followed by a specific string n |
RegExp Object Properties
Property |
Description |
global |
Specifies if the “g” modifier is set |
ignoreCase |
Specifies if the “i” modifier is set |
lastIndex |
The index at which to start the next match |
multiline |
Specifies if the “m” modifier is set |
source |
The text of the RegExp pattern |
RegExp Object Methods
Method |
Description |
compile() |
Compiles a regular expression |
exec() |
Tests for a match in a string. Returns the first match |
test() |
Tests for a match in a string. Returns true or false |