
15 PHP regular expressions for web developers
Regular expressions are a very useful tool for developers. They allow to find, identify or replace text, words or any kind of characters. In this article, I have compiled 15+ extremely useful regular expressions that any web developer should have in his toolkit.
Getting started with regular expressions
For many beginners, regular expressions seems to be hard to learn and use. In fact, they’re far less hard than you may think. Before we dive deep inside regexp with useful and reusable codes, let’s quickly see the basics:
Regular expressions syntax
| Regular Expression | Will match… |
| foo | The string “foo” |
| ^foo | “foo” at the start of a string |
| foo$ | “foo” at the end of a string |
| ^foo$ | “foo” when it is alone on a string |
| [abc] | a, b, or c |
| [a-z] | Any lowercase letter |
| [^A-Z] | Any character that is not a uppercase letter |
| (gif|jpg) | Matches either “gif” or “jpeg” |
| [a-z]+ | One or more lowercase letters |
| [0-9.-] | Аny number, dot, or minus sign |
| ^[a-zA-Z0-9_]{1,}$ | Any word of at least one letter, number or _ |
| ([wx])([yz]) | wy, wz, xy, or xz |
| [^A-Za-z0-9] | Any symbol (not a number or a letter) |
| ([A-Z]{3}|[0-9]{4}) | Matches three letters or four numbers |
PHP regular expression functions
| Function | Description |
|---|---|
| preg_match() | The preg_match() function searches string for pattern, returning true if pattern exists, and false otherwise. |
| preg_match_all() | The preg_match_all() function matches all occurrences of pattern in string. |
| preg_replace() | The preg_replace() function operates just like ereg_replace(), except that regular expressions can be used in the pattern and replacement input parameters. |
| preg_split() | The preg_split() function operates exactly like split(), except that regular expressions are accepted as input parameters for pattern. |
| preg_grep() | The preg_grep() function searches all elements of input_array, returning all elements matching the regexp pattern. |
| preg_ quote() | Quote regular expression characters |
Validate domain name
Verify if a string is a valid domain name.
$url = "http://komunitasweb.com/";
if (preg_match('/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i', $url)) {
echo "Your url is ok.";
} else {
echo "Wrong url.";
}
» Source
Enlight a word from a text
This very useful regular expression find a specific word in a text, and enlight it. Extremely useful for search results.
$text = "Sample sentence from KomunitasWeb, regex has become popular in web programming. Now we learn regex. According to wikipedia, Regular expressions (abbreviated as regex or regexp, with plural forms regexes, regexps, or regexen) are written in a formal language that can be interpreted by a regular expression processor";
$text = preg_replace("/b(regex)b/i", '<span style="background:#5fc9f6">1</span>', $text);
echo $text;
» Source
Enlight search results in your WordPress blog
As I just said that the previous code snippet could be very handy on search results, here is a great way to implement it on a WordPress blog.
Open your search.php file and find the the_title() function. Replace it with the following:
echo $title;
Now, just before the modified line, add this code:
<?php
$title = get_the_title();
$keys= explode(" ",$s);
$title = preg_replace('/('.implode('|', $keys) .')/iu',
'<strong class="search-excerpt">\0</strong>',
$title);
?>Save the search.php file and open style.css. Append the following line to it:
strong.search-excerpt { background: yellow; }» Source
Get all images from a HTML document
If you ever widhed to be able to get all images form a webpage, this code is a must have for you. You should easily create an image downloader using the power of cURL.
$images = array();
preg_match_all('/(img|src)=("|')[^"'>]+/i', $data, $media);
unset($data);
$data=preg_replace('/(img|src)("|'|="|=')(.*)/i',"$3",$media[0]);
foreach($data as $url)
{
$info = pathinfo($url);
if (isset($info['extension']))
{
if (($info['extension'] == 'jpg') ||
($info['extension'] == 'jpeg') ||
($info['extension'] == 'gif') ||
($info['extension'] == 'png'))
array_push($images, $url);
}
}
» Source
Remove repeated words (case insensitive)
Often repeating words while typing? This handy regexp will be very helpful.
$text = preg_replace("/s(w+s)1/i", "$1", $text);
» Source
Remove repeated punctuation
Same as above, but with punctuation. Goodbye repeated commas!
$text = preg_replace("/.+/i", ".", $text);
» Source
Matching a XML/HTML tag
This simple function takes two arguments: The first is the tag you’d like to match, and the second is the variable containing the XML or HTML. Once again, this can be very powerful used along with cURL.
function get_tag( $tag, $xml ) {
$tag = preg_quote($tag);
preg_match_all('{<'.$tag.'[^>]*>(.*?)</'.$tag.'>.'}',
$xml,
$matches,
PREG_PATTERN_ORDER);
return $matches[1];
}
» Source
Matching an XHTML/XML tag with a certain attribute value
This function is very similar to the previous one, but it allow you to match a tag having a specific attribute. For example, you could easily match <div id=”header”>.
function get_tag( $attr, $value, $xml, $tag=null ) {
if( is_null($tag) )
$tag = '\w+';
else
$tag = preg_quote($tag);
$attr = preg_quote($attr);
$value = preg_quote($value);
$tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*".
"(['\"])$value\\2[^>]*>(.*?)<\/\\1>/"
preg_match_all($tag_regex,
$xml,
$matches,
PREG_PATTERN_ORDER);
return $matches[3];
}
» Source
Matching hexadecimal color values
Another interesting tool for web developers! It allows you to match/validate a hexadecimal color value.
$string = "#555555";
if (preg_match('/^#(?:(?:[a-fd]{3}){1,2})$/i', $string)) {
echo "example 6 successful.";
}
» Source
Find page title
This handy code snippet will find and print the text within the <title> and </title> tags of a html page.
$fp = fopen("http://www.catswhocode.com/blog","r");
while (!feof($fp) ){
$page .= fgets($fp, 4096);
}
$titre = eregi("<title>(.*)</title>",$page,$regs);
echo $regs[1];
fclose($fp);
Parsing Apache logs
Most websites are running on the well-known Apache webserver. If your website does, what about using PHP and some regular expressions to parse Apache logs?
//Logs: Apache web server //Successful hits to HTML files only. Useful for counting the number of page views. '^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)/[^ ?"]+?.html?)??((?#parameters)[^ ?"]+)? HTTP/[0-9.]+"s+(?#status code)200s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$' //Logs: Apache web server //404 errors only '^((?#client IP or domain name)S+)s+((?#basic authentication)S+s+S+)s+[((?#date and time)[^]]+)]s+"(?:GET|POST|HEAD) ((?#file)[^ ?"]+)??((?#parameters)[^ ?"]+)? HTTP/[0-9.]+"s+(?#status code)404s+((?#bytes transferred)[-0-9]+)s+"((?#referrer)[^"]*)"s+"((?#user agent)[^"]*)"$'
» Source
Replacing double quotes by smart qutotes
If you’re a typographer lover, you’ll probably love this regexp, which allow you to replace normal double quotes by smart quotes. A regular expression of that kind is used by WordPress on contents.
preg_replace('B"b([^"x84x93x94rn]+)b"B', '?1?', $text);
» Source
Checking password complexity
This regular expression will tests if the input consists of 6 or more letters, digits, underscores and hyphens.
The input must contain at least one upper case letter, one lower case letter and one digit.
'A(?=[-_a-zA-Z0-9]*?[A-Z])(?=[-_a-zA-Z0-9]*?[a-z])(?=[-_a-zA-Z0-9]*?[0-9])[-_a-zA-Z0-9]{6,}z'
» Source
WordPress: Using regexp to retrieve images from post
As I know many of you are WordPress users, you’ll probably enjoy that code which allow you to retrieve all images from post content and display it.
To use this code on your blog, simply paste the following code on one of your theme files.
<?php if (have_posts()) : ?>
<?php while (have_posts()) : the_post(); ?>
<?php
$szPostContent = $post->post_content;
$szSearchPattern = '~<img [^>]* />~';
// Run preg_match_all to grab all the images and save the results in $aPics
preg_match_all( $szSearchPattern, $szPostContent, $aPics );
// Check to see if we have at least 1 image
$iNumberOfPics = count($aPics[0]);
if ( $iNumberOfPics > 0 ) {
// Now here you would do whatever you need to do with the images
// For this example the images are just displayed
for ( $i=0; $i < $iNumberOfPics ; $i++ ) {
echo $aPics[0][$i];
};
};
endwhile;
endif;
?>
» Source
Generating automatic smileys
Another function used by WordPress, this one allow you to automatically replace a smiley symbol by an image.
$texte='A text with a smiley :-)';
echo str_replace(':-)','<img src="smileys/souriant.png">',$texte);




116 Comments + Trackbacks
7.27.2009
Just wanna say awesome post. The whole PHP content you showed above really help most of the web developers and help to make their task easy. Me too very thankful to you for this nice post..
7.27.2009
Hey, I haven’t tested to make sure, but I think the first get_tag function would be broken by the following:
get_tag('a', '<a title="is a > b?" href="a-gt-b.htm" />Is A > B?</a>');
The RegEx would match that first > in the attribute and the following text would be returned
b?” href=”a-gt-b.htm” />Is A > B?
OK, hopefully none of this comment will be interpreted by WordPress in an unexpected way
7.27.2009
Hello,
I don’t undertand how they work. For example if i want that $test don’t have any uppercase letter, how I have to do?
7.27.2009
first I would like to say, “great article”. I haven’t used RegEx in quite sometime now, but if I remember correctly “[0-9.-] Аny number, dot, or minus sign” in this example the dot will match anything, if you would like match the dot you have to escape it. please correct me if I am wrong.
7.27.2009
very nice
thanks
7.27.2009
Sweet article! I’ve seen a lot of Cats Who Code around the web recently, keep up the great posts and I’ll be following along all the way.
7.27.2009
I am a big fan of regular expressions, because they can make sorting through a bunch of text so much simpler. I wish I had known about them when I first started coding. This is a cool guide and has some great examples!
7.28.2009
Seems WP has munged up your code (particularly backslash escaping).
7.28.2009
You mean:
$text = preg_replace(“/\\.+/i”, “.”, $text);
7.28.2009
Excellent article, I found the code to parse Apache logs and to get all images in a HTML document particularly clever. You did however leave out a very common use for regex that web developers often need to use: validating email addresses.
$address = 'some email address here';
$ valid = preg_match('/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/', $address);
echo $valid;
The preg_match() function above will of course evaluate to false. Again, excellent article. I will be putting some of these to use in the near future no doubt.
7.28.2009
That’s a useful list, I recently watched the Themeforest screencast on regex too.
And to anyone who gets trouble when posting code, just escape them using an encoder like Postable.
7.28.2009
Enlight != word. I’d suggest ‘highlight’ instead.
@#3 – if you want to make sure that you have only lowercase chars in your string $test, do
if(preg_match(“/[a-z]/”,$test))
{
echo ‘all lowercase’;
}
7.28.2009
oops – I see that my five second regex doesn’t quite do what you’re asking for – make that
if(!preg_match(”/[A-Z]/”,$test))
{
echo ‘all lowercase’;
}
7.28.2009
Merci Jean, c’est complet et et très utile.
Bye.
7.28.2009
You forgot to escape dots in some of your expressions.
A dot is a meta-character to match all characters except newline.
7.28.2009
Thanks a lot for these tips.
Very useful.
Bookmarked
7.28.2009
This is an awesome online regex tester. I use it all the time. http://www.spaweditor.com/scripts/regex/index.php
7.28.2009
What do you mean by “enlight” – is that like, highlight?
7.28.2009
Thanks a lot! Very useful tips and apps! I’ve tried a few already and can’t be more happier.
7.29.2009
Great set of regex’s. Another good one to add would be a decent phone number validation, especially for international #’s, and maybe a clean credit card number validator.
Anyway, good resource.
7.29.2009
Validate domain name is not working.
Anyone want to correct this regular expression?
Error: Found:
Warning: preg_match() [function.preg-match]: Unknown modifier ‘/’ in D:\projects\regex.php on line 3
Wrong url.
$url = “http://komunitasweb.com/”;
if (preg_match(‘/^(http|https|ftp)://([A-Z0-9][A-Z0-9_-]*(?:.[A-Z0-9][A-Z0-9_-]*)+):?(d+)?/?/i’, $url)) {
echo “Your url is ok.”;
} else {
echo “Wrong url.”;
}
7.29.2009
Regarding the example “Validate domain name” – does that match IDN (Internationalized Domain Name) domains also? Like: http://www.åäö.se
7.29.2009
Good post!….
would like to add the following ExtJS regexp form validation that you can simply use for PHP regexp as well http://extjs.com/forum/showthread.php?t=4271
7.29.2009
Nice Post! Thanks
7.29.2009
Hi. Just wanted to say that this is an excellent post. I needed someone to explain clearly the meaning of symbols for reg expressions and this does it with ease. Bookmarked and I will be subscribing to the RSS. Many thanks.
7.29.2009
I love this post…. very useful thx
7.29.2009
very great post! anyway this is very useful in some projects, specially for web scrap
I use to work most this things for a year but suddenly I getting bored..
7.29.2009
Super cool story, bro. None of these examples actually work since all backslashes have been stripped.
7.29.2009
Following one is wrong:
Remove repeated punctuation
Same as above, but with punctuation. Goodbye repeated commas!
$text = preg_replace(“/.+/i”, “.”, $text);
You’re replacing any number of any not a line break character with a dot. If you wished to replace dots, you must escape it first like:
$text = preg_replace(“/\.+/i”, “.”, $text);
Or if you wanted to replace multiple commas, put commas (no escaping needed).
7.29.2009
It looks like a number of the regex strings were modified when you copied and pasted them. Primarily, the backslashes were dropped. For example, you have “/s(w+s)1/i” for the remove repeated words regex when it should be “/\s(\w+\s)\1/i”. Repeated punctuation, hexadecimal color values, smart quotes, password complexity, and probably some others that I missed all have this problem.
7.29.2009
Love seeing a post not just about regular expressions, but actual usage and examples. Thanks for the post.
7.30.2009
Agree great post for the simple fact you post snippets of code and use real world examples. The replace smiley exmaple is the most useful I think!?
Thanks for the information!
7.31.2009
Enlight…highlight…what’s the difference. I’m just a stupid American and I knew what he meant. I’m pretty sure that if I had to, I would have chosen the wrong french word, or tense, or gender…whatever. Good post – simplest, most useful summary of regex I’ve ever read. Thanks.
7.31.2009
Thanks for the great article.
8.1.2009
Can you please go through the expression for Validate domain name?
I also got the error =
Warning: preg_match() [function.preg-match]: Unknown modifier ‘/’
8.1.2009
Matching XML tags won’t work if you have similar nested tags. XML in general is quite evil.
8.1.2009
Regular expressions make it more easy for the developers!
8.1.2009
Thanks a lot! Very useful tips and apps! I’ve tried a few already and can’t be more happier.
8.1.2009
In your domain name validation, you got something like this:
(d+)?
I assume it’s meant to validate a port number?
It should be instead be like this: (:\d+)
Otherwise it would match a single colon without a number following it.
Also note there was a backslash missing before the d.
8.1.2009
Very Usefull! Thanks
8.2.2009
Fantastic article. I was wondering though, any ideas why a preg_replace might not work with the_excerpt, and what could I do to make it work?
8.4.2009
Cool – thanks for yout work.
8.5.2009
Hi! Pretty nice list of regular expressions. Could be useful. Will check again when i will need them. I also check your blog and there are a lot of useful posts.
8.6.2009
I am really surpried by getting this collections of regular expressions, It’s really very helpful.
8.10.2009
Validate domain name regular expression:
(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))
8.10.2009
Superb post, bookmarked for sure !
Nice one!
8.10.2009
helpful codes, thanks for the list..
8.11.2009
How much ever I try, they just don’t seem to get into my head
will bookmark and read again
8.12.2009
Thanks for this post. It’s surprising that many developers don’t really understand the full potential of regular expressions. They write elaborate functions to extract items of data, which can be done with a one line RE!!!
8.12.2009
“Regular expressions are a very useful tool for developers. They allow to find, identify or replace text, words or any kind of characters. In this article, I have compiled 15+ extremely useful regular expressions that any web developer should have in his toolkit.”
Regular expressions are really quite useful for web developers because they make the tedious job of searching and replacing much easier.
8.18.2009
Thanks, a really great article. I already bookmarked this page.
8.18.2009
thanks for your information.it is very helpful for me!
thanks
8.25.2009
#9 Matching hexadecimal color values the regex doesnt work for all hexadecimal codes, for examble numeric ones, and alpha numeric. I suggest that this regex is used instead:
To Validate a Hexadecimal Colour, with or without the #
/^(#)?([0-9a-f]{1,2}){3}$/i
To Validate a Hexadecimal Colour, WITH #
/^#([0-9a-f]{1,2}){3}$/i
You could use this to replace colours in a string via:
$str = ‘#6699CC and #00ff44 and #ff0000′;
echo preg_replace(‘|#([0-9a-f]{1,2}){3}|i’,'$0′,$str);
8.26.2009
That sure cleared some things up! Thanks a lot, keep writing stuff like that. I`m in here on a regular basis just to learn. =)
9.1.2009
Great info, sure cleared some things up. Guess I still got a couple of things to learn, though. Thank you.
9.3.2009
Matching a XML/HTML tag: example does not work, same problem on the source website.
copy/paste is ok. copy/paste+test is better.
But i have no anger. Let the light of love shine upon your soul.
9.4.2009
I use Regular Expressions everyday, could not function without them. Great list by the way!
9.12.2009
Highly informative and useful post. This would be a great reference guide to any web developer out there from beginner to advanced level. All I can say is, “Bravo”!
9.20.2009
This is useful stuff, will be bookmarking this page!
Has anyone got a good introduction to php page to look at?
10.1.2009
How can I do this?
Consider the following sms header
To: #
Modem: GSM1
Sent: 09-09-21 13:25:39
Message_id: 69
IMSI: 413022600405030
I need to get the Message id (number only)
Please help me to do it…
10.7.2009
TItle regular expression is incorrect. TITILE tag can have a number of attribues (i.e. lang), so the right one will be the following:
$titre = eregi(“]*>(.*)”,$page,$regs);
10.29.2009
Wonderful list. Here is a very useful regex tester for PHP.
http://www.pagecolumn.com/tool/pregtest.htm
10.29.2009
I am having a weird problem with Regex to validate domain names. I am using the following expression “/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i”
It works fine the first time the user same this regular expression. But if the user saves the same expression the next time, it stops working. Also if I check the expression at this point all the back slashes \ are missing from the expression. What could be the problem.
11.11.2009
Great blog post, exactly what i was looking for and has saved me time figuring it out for myself. Reg-ex is a specialist subject all on its own
12.7.2009
Excellent Article. I learned alot from this article. I was always scared learning regular expressions. but from your article i learned it easily.
1.25.2010
This looked like such a great reference. Until I tried copy and paste of one of the code snippets. Then read the comments and realized that some might not work. Not the author’s fault, I’m sure, but it’s disappointing nonetheless it’s been this long and he hasn’t been back to rectify the fault. Another waste of time.