CINXE.COM
PHP: preg_match - Manual
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>PHP: preg_match - Manual </title> <link rel="icon" type="image/svg+xml" sizes="any" href="https://www.php.net/favicon.svg?v=2"> <link rel="icon" type="image/png" sizes="196x196" href="https://www.php.net/favicon-196x196.png?v=2"> <link rel="icon" type="image/png" sizes="32x32" href="https://www.php.net/favicon-32x32.png?v=2"> <link rel="icon" type="image/png" sizes="16x16" href="https://www.php.net/favicon-16x16.png?v=2"> <link rel="shortcut icon" href="https://www.php.net/favicon.ico?v=2"> <link rel="search" type="application/opensearchdescription+xml" href="http://php.net/phpnetimprovedsearch.src" title="Add PHP.net search"> <link rel="alternate" type="application/atom+xml" href="https://www.php.net/releases/feed.php" title="PHP Release feed"> <link rel="alternate" type="application/atom+xml" href="https://www.php.net/feed.atom" title="PHP: Hypertext Preprocessor"> <link rel="canonical" href="https://www.php.net/manual/en/function.preg-match.php"> <link rel="shorturl" href="https://www.php.net/preg-match"> <link rel="alternate" href="https://www.php.net/preg-match" hreflang="x-default"> <link rel="contents" href="https://www.php.net/manual/en/index.php"> <link rel="index" href="https://www.php.net/manual/en/ref.pcre.php"> <link rel="prev" href="https://www.php.net/manual/en/function.preg-last-error-msg.php"> <link rel="next" href="https://www.php.net/manual/en/function.preg-match-all.php"> <link rel="alternate" href="https://www.php.net/manual/en/function.preg-match.php" hreflang="en"> <link rel="alternate" href="https://www.php.net/manual/de/function.preg-match.php" hreflang="de"> <link rel="alternate" href="https://www.php.net/manual/es/function.preg-match.php" hreflang="es"> <link rel="alternate" href="https://www.php.net/manual/fr/function.preg-match.php" hreflang="fr"> <link rel="alternate" href="https://www.php.net/manual/it/function.preg-match.php" hreflang="it"> <link rel="alternate" href="https://www.php.net/manual/ja/function.preg-match.php" hreflang="ja"> <link rel="alternate" href="https://www.php.net/manual/pt_BR/function.preg-match.php" hreflang="pt_BR"> <link rel="alternate" href="https://www.php.net/manual/ru/function.preg-match.php" hreflang="ru"> <link rel="alternate" href="https://www.php.net/manual/tr/function.preg-match.php" hreflang="tr"> <link rel="alternate" href="https://www.php.net/manual/uk/function.preg-match.php" hreflang="uk"> <link rel="alternate" href="https://www.php.net/manual/zh/function.preg-match.php" hreflang="zh"> <link rel="stylesheet" type="text/css" href="/cached.php?t=1707321815&f=/fonts/Fira/fira.css" media="screen"> <link rel="stylesheet" type="text/css" href="/cached.php?t=1707321815&f=/fonts/Font-Awesome/css/fontello.css" media="screen"> <link rel="stylesheet" type="text/css" href="/cached.php?t=1738926002&f=/styles/theme-base.css" media="screen"> <link rel="stylesheet" type="text/css" href="/cached.php?t=1730558402&f=/styles/theme-medium.css" media="screen"> <base href="https://www.php.net/manual/en/function.preg-match.php"> <meta name="Description" content="PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world." /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:site" content="@official_php" /> <meta name="twitter:title" content="PHP: Hypertext Preprocessor" /> <meta name="twitter:description" content="PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world." /> <meta name="twitter:creator" content="@official_php" /> <meta name="twitter:image:src" content="https://www.php.net/images/meta-image.png" /> <meta itemprop="name" content="PHP: Hypertext Preprocessor" /> <meta itemprop="description" content="PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world." /> <meta itemprop="image" content="https://www.php.net/images/meta-image.png" /> <meta property="og:image" content="https://www.php.net/images/meta-image.png" /> <meta property="og:description" content="PHP is a popular general-purpose scripting language that powers everything from your blog to the most popular websites in the world." /> <link href="https://fosstodon.org/@php" rel="me" /> <!-- Matomo --> <script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(["setDoNotTrack", true]); _paq.push(["disableCookies"]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="https://analytics.php.net/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script> <!-- End Matomo Code --> </head> <body class="docs "> <nav class="navbar navbar-fixed-top"> <div class="navbar__inner"> <a href="/" aria-label="PHP Home" class="navbar__brand"> <img src="/images/logos/php-logo-white.svg" aria-hidden="true" width="80" height="40" > </a> <div id="navbar__offcanvas" tabindex="-1" class="navbar__offcanvas" aria-label="Menu" > <button id="navbar__close-button" class="navbar__icon-item navbar_icon-item--visually-aligned navbar__close-button" > <svg xmlns="http://www.w3.org/2000/svg" width="24" viewBox="0 0 24 24" fill="currentColor"><path d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" /></svg> </button> <ul class="navbar__nav"> <li class="navbar__item"> <a href="/downloads.php" class="navbar__link " > Downloads </a> </li> <li class="navbar__item"> <a href="/docs.php" aria-current="page" class="navbar__link navbar__link--active " > Documentation </a> </li> <li class="navbar__item"> <a href="/get-involved.php" class="navbar__link " > Get Involved </a> </li> <li class="navbar__item"> <a href="/support.php" class="navbar__link " > Help </a> </li> <li class="navbar__item"> <a href="/releases/8.4/index.php" class="navbar__link navbar__release" > <img src="/images/php8/logo_php8_4.svg" alt="PHP 8.4"> </a> </li> </ul> </div> <div class="navbar__right"> <!-- Desktop default search --> <form action="/manual-lookup.php" class="navbar__search-form" > <label for="navbar__search-input" aria-label="Search docs"> <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" > <circle cx="11" cy="11" r="8"></circle> <line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> </label> <input type="search" name="pattern" id="navbar__search-input" class="navbar__search-input" placeholder="Search docs" accesskey="s" > <input type="hidden" name="scope" value="quickref"> </form> <!-- Desktop encanced search --> <button id="navbar__search-button" class="navbar__search-button" hidden > <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" > <circle cx="11" cy="11" r="8"></circle> <line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> Search docs </button> <!-- Mobile default items --> <a id="navbar__search-link" href="/lookup-form.php" aria-label="Search docs" class="navbar__icon-item navbar__search-link" > <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" > <circle cx="11" cy="11" r="8"></circle> <line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> </a> <a id="navbar__menu-link" href="/menu.php" aria-label="Menu" class="navbar__icon-item navbar_icon-item--visually-aligned navbar_menu-link" > <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="24" viewBox="0 0 24 24" fill="currentColor" > <path d="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z" /> </svg> </a> <!-- Mobile enhanced items --> <button id="navbar__search-button-mobile" aria-label="Search docs" class="navbar__icon-item navbar__search-button-mobile" hidden > <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" > <circle cx="11" cy="11" r="8"></circle> <line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> </button> <button id="navbar__menu-button" aria-label="Menu" class="navbar__icon-item navbar_icon-item--visually-aligned" hidden > <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="24" viewBox="0 0 24 24" fill="currentColor" > <path d="M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z" /> </svg> </button> </div> <div id="navbar__backdrop" class="navbar__backdrop" ></div> </div> <div id="flash-message"></div> </nav> <nav id="trick"><div><dl> <dt><a href='/manual/en/getting-started.php'>Getting Started</a></dt> <dd><a href='/manual/en/introduction.php'>Introduction</a></dd> <dd><a href='/manual/en/tutorial.php'>A simple tutorial</a></dd> <dt><a href='/manual/en/langref.php'>Language Reference</a></dt> <dd><a href='/manual/en/language.basic-syntax.php'>Basic syntax</a></dd> <dd><a href='/manual/en/language.types.php'>Types</a></dd> <dd><a href='/manual/en/language.variables.php'>Variables</a></dd> <dd><a href='/manual/en/language.constants.php'>Constants</a></dd> <dd><a href='/manual/en/language.expressions.php'>Expressions</a></dd> <dd><a href='/manual/en/language.operators.php'>Operators</a></dd> <dd><a href='/manual/en/language.control-structures.php'>Control Structures</a></dd> <dd><a href='/manual/en/language.functions.php'>Functions</a></dd> <dd><a href='/manual/en/language.oop5.php'>Classes and Objects</a></dd> <dd><a href='/manual/en/language.namespaces.php'>Namespaces</a></dd> <dd><a href='/manual/en/language.enumerations.php'>Enumerations</a></dd> <dd><a href='/manual/en/language.errors.php'>Errors</a></dd> <dd><a href='/manual/en/language.exceptions.php'>Exceptions</a></dd> <dd><a href='/manual/en/language.fibers.php'>Fibers</a></dd> <dd><a href='/manual/en/language.generators.php'>Generators</a></dd> <dd><a href='/manual/en/language.attributes.php'>Attributes</a></dd> <dd><a href='/manual/en/language.references.php'>References Explained</a></dd> <dd><a href='/manual/en/reserved.variables.php'>Predefined Variables</a></dd> <dd><a href='/manual/en/reserved.exceptions.php'>Predefined Exceptions</a></dd> <dd><a href='/manual/en/reserved.interfaces.php'>Predefined Interfaces and Classes</a></dd> <dd><a href='/manual/en/reserved.attributes.php'>Predefined Attributes</a></dd> <dd><a href='/manual/en/context.php'>Context options and parameters</a></dd> <dd><a href='/manual/en/wrappers.php'>Supported Protocols and Wrappers</a></dd> </dl> <dl> <dt><a href='/manual/en/security.php'>Security</a></dt> <dd><a href='/manual/en/security.intro.php'>Introduction</a></dd> <dd><a href='/manual/en/security.general.php'>General considerations</a></dd> <dd><a href='/manual/en/security.cgi-bin.php'>Installed as CGI binary</a></dd> <dd><a href='/manual/en/security.apache.php'>Installed as an Apache module</a></dd> <dd><a href='/manual/en/security.sessions.php'>Session Security</a></dd> <dd><a href='/manual/en/security.filesystem.php'>Filesystem Security</a></dd> <dd><a href='/manual/en/security.database.php'>Database Security</a></dd> <dd><a href='/manual/en/security.errors.php'>Error Reporting</a></dd> <dd><a href='/manual/en/security.variables.php'>User Submitted Data</a></dd> <dd><a href='/manual/en/security.hiding.php'>Hiding PHP</a></dd> <dd><a href='/manual/en/security.current.php'>Keeping Current</a></dd> <dt><a href='/manual/en/features.php'>Features</a></dt> <dd><a href='/manual/en/features.http-auth.php'>HTTP authentication with PHP</a></dd> <dd><a href='/manual/en/features.cookies.php'>Cookies</a></dd> <dd><a href='/manual/en/features.sessions.php'>Sessions</a></dd> <dd><a href='/manual/en/features.file-upload.php'>Handling file uploads</a></dd> <dd><a href='/manual/en/features.remote-files.php'>Using remote files</a></dd> <dd><a href='/manual/en/features.connection-handling.php'>Connection handling</a></dd> <dd><a href='/manual/en/features.persistent-connections.php'>Persistent Database Connections</a></dd> <dd><a href='/manual/en/features.commandline.php'>Command line usage</a></dd> <dd><a href='/manual/en/features.gc.php'>Garbage Collection</a></dd> <dd><a href='/manual/en/features.dtrace.php'>DTrace Dynamic Tracing</a></dd> </dl> <dl> <dt><a href='/manual/en/funcref.php'>Function Reference</a></dt> <dd><a href='/manual/en/refs.basic.php.php'>Affecting PHP's Behaviour</a></dd> <dd><a href='/manual/en/refs.utilspec.audio.php'>Audio Formats Manipulation</a></dd> <dd><a href='/manual/en/refs.remote.auth.php'>Authentication Services</a></dd> <dd><a href='/manual/en/refs.utilspec.cmdline.php'>Command Line Specific Extensions</a></dd> <dd><a href='/manual/en/refs.compression.php'>Compression and Archive Extensions</a></dd> <dd><a href='/manual/en/refs.crypto.php'>Cryptography Extensions</a></dd> <dd><a href='/manual/en/refs.database.php'>Database Extensions</a></dd> <dd><a href='/manual/en/refs.calendar.php'>Date and Time Related Extensions</a></dd> <dd><a href='/manual/en/refs.fileprocess.file.php'>File System Related Extensions</a></dd> <dd><a href='/manual/en/refs.international.php'>Human Language and Character Encoding Support</a></dd> <dd><a href='/manual/en/refs.utilspec.image.php'>Image Processing and Generation</a></dd> <dd><a href='/manual/en/refs.remote.mail.php'>Mail Related Extensions</a></dd> <dd><a href='/manual/en/refs.math.php'>Mathematical Extensions</a></dd> <dd><a href='/manual/en/refs.utilspec.nontext.php'>Non-Text MIME Output</a></dd> <dd><a href='/manual/en/refs.fileprocess.process.php'>Process Control Extensions</a></dd> <dd><a href='/manual/en/refs.basic.other.php'>Other Basic Extensions</a></dd> <dd><a href='/manual/en/refs.remote.other.php'>Other Services</a></dd> <dd><a href='/manual/en/refs.search.php'>Search Engine Extensions</a></dd> <dd><a href='/manual/en/refs.utilspec.server.php'>Server Specific Extensions</a></dd> <dd><a href='/manual/en/refs.basic.session.php'>Session Extensions</a></dd> <dd><a href='/manual/en/refs.basic.text.php'>Text Processing</a></dd> <dd><a href='/manual/en/refs.basic.vartype.php'>Variable and Type Related Extensions</a></dd> <dd><a href='/manual/en/refs.webservice.php'>Web Services</a></dd> <dd><a href='/manual/en/refs.utilspec.windows.php'>Windows Only Extensions</a></dd> <dd><a href='/manual/en/refs.xml.php'>XML Manipulation</a></dd> <dd><a href='/manual/en/refs.ui.php'>GUI Extensions</a></dd> </dl> <dl> <dt>Keyboard Shortcuts</dt><dt>?</dt> <dd>This help</dd> <dt>j</dt> <dd>Next menu item</dd> <dt>k</dt> <dd>Previous menu item</dd> <dt>g p</dt> <dd>Previous man page</dd> <dt>g n</dt> <dd>Next man page</dd> <dt>G</dt> <dd>Scroll to bottom</dd> <dt>g g</dt> <dd>Scroll to top</dd> <dt>g h</dt> <dd>Goto homepage</dd> <dt>g s</dt> <dd>Goto search<br>(current page)</dd> <dt>/</dt> <dd>Focus search box</dd> </dl></div></nav> <div id="goto"> <div class="search"> <div class="text"></div> <div class="results"><ul></ul></div> </div> </div> <div id="breadcrumbs" class="clearfix"> <div id="breadcrumbs-inner"> <div class="next"> <a href="function.preg-match-all.php"> preg_match_all » </a> </div> <div class="prev"> <a href="function.preg-last-error-msg.php"> « preg_last_error_msg </a> </div> <ul> <li><a href='index.php'>PHP Manual</a></li> <li><a href='funcref.php'>Function Reference</a></li> <li><a href='refs.basic.text.php'>Text Processing</a></li> <li><a href='book.pcre.php'>PCRE</a></li> <li><a href='ref.pcre.php'>PCRE Functions</a></li> </ul> </div> </div> <div id="layout" class="clearfix"> <section id="layout-content"> <div class="page-tools"> <div class="change-language"> <form action="/manual/change.php" method="get" id="changelang" name="changelang"> <fieldset> <label for="changelang-langs">Change language:</label> <select onchange="document.changelang.submit()" name="page" id="changelang-langs"> <option value='en/function.preg-match.php' selected="selected">English</option> <option value='de/function.preg-match.php'>German</option> <option value='es/function.preg-match.php'>Spanish</option> <option value='fr/function.preg-match.php'>French</option> <option value='it/function.preg-match.php'>Italian</option> <option value='ja/function.preg-match.php'>Japanese</option> <option value='pt_BR/function.preg-match.php'>Brazilian Portuguese</option> <option value='ru/function.preg-match.php'>Russian</option> <option value='tr/function.preg-match.php'>Turkish</option> <option value='uk/function.preg-match.php'>Ukrainian</option> <option value='zh/function.preg-match.php'>Chinese (Simplified)</option> <option value='help-translate.php'>Other</option> </select> </fieldset> </form> </div> </div><div id="function.preg-match" class="refentry"> <div class="refnamediv"> <h1 class="refname">preg_match</h1> <p class="verinfo">(PHP 4, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">preg_match</span> — <span class="dc-title">Perform a regular expression match</span></p> </div> <div class="refsect1 description" id="refsect1-function.preg-match-description"> <h3 class="title">Description</h3> <div class="methodsynopsis dc-description"> <span class="methodname"><strong>preg_match</strong></span>(<br> <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$pattern</code></span>,<br> <span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$subject</code></span>,<br> <span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter reference">&$matches</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span></span>,<br> <span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$flags</code><span class="initializer"> = 0</span></span>,<br> <span class="methodparam"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span> <code class="parameter">$offset</code><span class="initializer"> = 0</span></span><br>): <span class="type"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span>|<span class="type"><a href="language.types.value.php" class="type false">false</a></span></span></div> <p class="para rdfs-comment"> Searches <code class="parameter">subject</code> for a match to the regular expression given in <code class="parameter">pattern</code>. </p> </div> <div class="refsect1 parameters" id="refsect1-function.preg-match-parameters"> <h3 class="title">Parameters</h3> <p class="para"> <dl> <dt><code class="parameter">pattern</code></dt> <dd> <p class="para"> The pattern to search for, as a string. </p> </dd> <dt><code class="parameter">subject</code></dt> <dd> <p class="para"> The input string. </p> </dd> <dt><code class="parameter">matches</code></dt> <dd> <p class="para"> If <code class="parameter">matches</code> is provided, then it is filled with the results of search. <var class="varname">$matches[0]</var> will contain the text that matched the full pattern, <var class="varname">$matches[1]</var> will have the text that matched the first captured parenthesized subpattern, and so on. </p> </dd> <dt><code class="parameter">flags</code></dt> <dd> <p class="para"> <code class="parameter">flags</code> can be a combination of the following flags: <dl> <dt><strong><code><a href="pcre.constants.php#constant.preg-offset-capture">PREG_OFFSET_CAPTURE</a></code></strong></dt> <dd> <p class="para"> If this flag is passed, for every occurring match the appendant string offset (in bytes) will also be returned. Note that this changes the value of <code class="parameter">matches</code> into an array where every element is an array consisting of the matched string at offset <code class="literal">0</code> and its string offset into <code class="parameter">subject</code> at offset <code class="literal">1</code>. <div class="informalexample"> <div class="example-contents"> <div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br />preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'/(foo)(bar)(baz)/'</span><span style="color: #007700">, </span><span style="color: #DD0000">'foobarbaz'</span><span style="color: #007700">, </span><span style="color: #0000BB">$matches</span><span style="color: #007700">, </span><span style="color: #0000BB">PREG_OFFSET_CAPTURE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> <p class="para">The above example will output:</p> <div class="example-contents screen"> <div class="annotation-interactive parameterscode"><pre class="parameterscode">Array ( [0] => Array ( [0] => foobarbaz [1] => 0 ) [1] => Array ( [0] => foo [1] => 0 ) [2] => Array ( [0] => bar [1] => 3 ) [3] => Array ( [0] => baz [1] => 6 ) )</pre> </div> </div> </div> </p> </dd> <dt><strong><code><a href="pcre.constants.php#constant.preg-unmatched-as-null">PREG_UNMATCHED_AS_NULL</a></code></strong></dt> <dd> <p class="para"> If this flag is passed, unmatched subpatterns are reported as <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>; otherwise they are reported as an empty <span class="type"><a href="language.types.string.php" class="type string">string</a></span>. <div class="informalexample"> <div class="example-contents"> <div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br />preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'/(a)(b)*(c)/'</span><span style="color: #007700">, </span><span style="color: #DD0000">'ac'</span><span style="color: #007700">, </span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'/(a)(b)*(c)/'</span><span style="color: #007700">, </span><span style="color: #DD0000">'ac'</span><span style="color: #007700">, </span><span style="color: #0000BB">$matches</span><span style="color: #007700">, </span><span style="color: #0000BB">PREG_UNMATCHED_AS_NULL</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> <p class="para">The above example will output:</p> <div class="example-contents screen"> <div class="annotation-interactive parameterscode"><pre class="parameterscode">array(4) { [0]=> string(2) "ac" [1]=> string(1) "a" [2]=> string(0) "" [3]=> string(1) "c" } array(4) { [0]=> string(2) "ac" [1]=> string(1) "a" [2]=> NULL [3]=> string(1) "c" }</pre> </div> </div> </div> </p> </dd> </dl> </p> </dd> <dt><code class="parameter">offset</code></dt> <dd> <p class="para"> Normally, the search starts from the beginning of the subject string. The optional parameter <code class="parameter">offset</code> can be used to specify the alternate place from which to start the search (in bytes). </p> <blockquote class="note"><p><strong class="note">Note</strong>: <p class="para"> Using <code class="parameter">offset</code> is not equivalent to passing <code class="code">substr($subject, $offset)</code> to <span class="function"><strong>preg_match()</strong></span> in place of the subject string, because <code class="parameter">pattern</code> can contain assertions such as <em>^</em>, <em>$</em> or <em>(?<=x)</em>. Compare: <div class="informalexample"> <div class="example-contents"> <div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br />$subject </span><span style="color: #007700">= </span><span style="color: #DD0000">"abcdef"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$pattern </span><span style="color: #007700">= </span><span style="color: #DD0000">'/^def/'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #0000BB">$pattern</span><span style="color: #007700">, </span><span style="color: #0000BB">$subject</span><span style="color: #007700">, </span><span style="color: #0000BB">$matches</span><span style="color: #007700">, </span><span style="color: #0000BB">PREG_OFFSET_CAPTURE</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> <p class="para">The above example will output:</p> <div class="example-contents screen"> <div class="annotation-interactive cdata"><pre> Array ( ) </pre></div> </div> <p class="para"> while this example </p> <div class="example-contents"> <div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br />$subject </span><span style="color: #007700">= </span><span style="color: #DD0000">"abcdef"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$pattern </span><span style="color: #007700">= </span><span style="color: #DD0000">'/^def/'</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #0000BB">$pattern</span><span style="color: #007700">, </span><span style="color: #0000BB">substr</span><span style="color: #007700">(</span><span style="color: #0000BB">$subject</span><span style="color: #007700">,</span><span style="color: #0000BB">3</span><span style="color: #007700">), </span><span style="color: #0000BB">$matches</span><span style="color: #007700">, </span><span style="color: #0000BB">PREG_OFFSET_CAPTURE</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> <p class="para"> will produce </p> <div class="example-contents screen"> <div class="annotation-interactive cdata"><pre> Array ( [0] => Array ( [0] => def [1] => 0 ) ) </pre></div> </div> <p class="para"> Alternatively, to avoid using <span class="function"><a href="function.substr.php" class="function">substr()</a></span>, use the <code class="literal">\G</code> assertion rather than the <code class="literal">^</code> anchor, or the <code class="literal">A</code> modifier instead, both of which work with the <code class="parameter">offset</code> parameter. </p> </div> </p> </p></blockquote> </dd> </dl> </p> </div> <div class="refsect1 returnvalues" id="refsect1-function.preg-match-returnvalues"> <h3 class="title">Return Values</h3> <p class="para"> <span class="function"><strong>preg_match()</strong></span> returns 1 if the <code class="parameter">pattern</code> matches given <code class="parameter">subject</code>, 0 if it does not, or <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> on failure. </p> <div class="warning"><strong class="warning">Warning</strong><p class="simpara">This function may return Boolean <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>, but may also return a non-Boolean value which evaluates to <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>. Please read the section on <a href="language.types.boolean.php" class="link">Booleans</a> for more information. Use <a href="language.operators.comparison.php" class="link">the === operator</a> for testing the return value of this function.</p></div> </div> <div class="refsect1 errors" id="refsect1-function.preg-match-errors"> <h3 class="title">Errors/Exceptions</h3> <p class="para"> If the regex pattern passed does not compile to a valid regex, an <strong><code><a href="errorfunc.constants.php#constant.e-warning">E_WARNING</a></code></strong> is emitted. </p> </div> <div class="refsect1 changelog" id="refsect1-function.preg-match-changelog"> <h3 class="title">Changelog</h3> <p class="para"> <table class="doctable informaltable"> <thead> <tr> <th>Version</th> <th>Description</th> </tr> </thead> <tbody class="tbody"> <tr> <td>7.2.0</td> <td> The <strong><code><a href="pcre.constants.php#constant.preg-unmatched-as-null">PREG_UNMATCHED_AS_NULL</a></code></strong> is now supported for the <code class="parameter">$flags</code> parameter. </td> </tr> </tbody> </table> </p> </div> <div class="refsect1 examples" id="refsect1-function.preg-match-examples"> <h3 class="title">Examples</h3> <p class="para"> <div class="example" id="example-4942"> <p><strong>Example #1 Find the string of text "php"</strong></p> <div class="example-contents"> <div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// The "i" after the pattern delimiter indicates a case-insensitive search<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/php/i"</span><span style="color: #007700">, </span><span style="color: #DD0000">"PHP is the web scripting language of choice."</span><span style="color: #007700">)) {<br /> echo </span><span style="color: #DD0000">"A match was found."</span><span style="color: #007700">;<br />} else {<br /> echo </span><span style="color: #DD0000">"A match was not found."</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> </p> <p class="para"> <div class="example" id="example-4943"> <p><strong>Example #2 Find the word "web"</strong></p> <div class="example-contents"> <div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">/* The \b in the pattern indicates a word boundary, so only the distinct<br /> * word "web" is matched, and not a word partial like "webbing" or "cobweb" */<br /></span><span style="color: #007700">if (</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/\bweb\b/i"</span><span style="color: #007700">, </span><span style="color: #DD0000">"PHP is the web scripting language of choice."</span><span style="color: #007700">)) {<br /> echo </span><span style="color: #DD0000">"A match was found."</span><span style="color: #007700">;<br />} else {<br /> echo </span><span style="color: #DD0000">"A match was not found."</span><span style="color: #007700">;<br />}<br /><br />echo </span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br /><br />if (</span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">"/\bweb\b/i"</span><span style="color: #007700">, </span><span style="color: #DD0000">"PHP is the website scripting language of choice."</span><span style="color: #007700">)) {<br /> echo </span><span style="color: #DD0000">"A match was found."</span><span style="color: #007700">;<br />} else {<br /> echo </span><span style="color: #DD0000">"A match was not found."</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> </div> </p> <p class="para"> <div class="example" id="example-4944"> <p><strong>Example #3 Getting the domain name out of a URL</strong></p> <div class="example-contents"> <div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// get host name from URL<br /></span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'@^(?:http://)?([^/]+)@i'</span><span style="color: #007700">,<br /> </span><span style="color: #DD0000">"http://www.php.net/index.html"</span><span style="color: #007700">, </span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$host </span><span style="color: #007700">= </span><span style="color: #0000BB">$matches</span><span style="color: #007700">[</span><span style="color: #0000BB">1</span><span style="color: #007700">];<br /><br /></span><span style="color: #FF8000">// get last two segments of host name<br /></span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'/[^.]+\.[^.]+$/'</span><span style="color: #007700">, </span><span style="color: #0000BB">$host</span><span style="color: #007700">, </span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"domain name is: </span><span style="color: #007700">{</span><span style="color: #0000BB">$matches</span><span style="color: #007700">[</span><span style="color: #0000BB">0</span><span style="color: #007700">]}</span><span style="color: #DD0000">\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?></span></span></code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="annotation-interactive examplescode"><pre class="examplescode">domain name is: php.net</pre> </div> </div> </div> </p> <p class="para"> <div class="example" id="example-4945"> <p><strong>Example #4 Using named subpattern</strong></p> <div class="example-contents"> <div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB"><?php<br /><br />$str </span><span style="color: #007700">= </span><span style="color: #DD0000">'foobar: 2008'</span><span style="color: #007700">;<br /><br /></span><span style="color: #0000BB">preg_match</span><span style="color: #007700">(</span><span style="color: #DD0000">'/(?P<name>\w+): (?P<digit>\d+)/'</span><span style="color: #007700">, </span><span style="color: #0000BB">$str</span><span style="color: #007700">, </span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">/* Alternative */<br />// preg_match('/(?<name>\w+): (?<digit>\d+)/', $str, $matches);<br /><br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$matches</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?></span></span></code></div> </div> <div class="example-contents"><p>The above example will output:</p></div> <div class="example-contents screen"> <div class="annotation-interactive examplescode"><pre class="examplescode">Array ( [0] => foobar: 2008 [name] => foobar [1] => foobar [digit] => 2008 [2] => 2008 )</pre> </div> </div> </div> </p> </div> <div class="refsect1 notes" id="refsect1-function.preg-match-notes"> <h3 class="title">Notes</h3> <div class="tip"><strong class="tip">Tip</strong> <p class="para"> Do not use <span class="function"><strong>preg_match()</strong></span> if you only want to check if one string is contained in another string. Use <span class="function"><a href="function.strpos.php" class="function">strpos()</a></span> instead as it will be faster. </p> </div> </div> <div class="refsect1 seealso" id="refsect1-function.preg-match-seealso"> <h3 class="title">See Also</h3> <p class="para"> <ul class="simplelist"> <li><a href="pcre.pattern.php" class="link">PCRE Patterns</a></li> <li><span class="function"><a href="function.preg-quote.php" class="function" rel="rdfs-seeAlso">preg_quote()</a> - Quote regular expression characters</span></li> <li><span class="function"><a href="function.preg-match-all.php" class="function" rel="rdfs-seeAlso">preg_match_all()</a> - Perform a global regular expression match</span></li> <li><span class="function"><a href="function.preg-replace.php" class="function" rel="rdfs-seeAlso">preg_replace()</a> - Perform a regular expression search and replace</span></li> <li><span class="function"><a href="function.preg-split.php" class="function" rel="rdfs-seeAlso">preg_split()</a> - Split string by a regular expression</span></li> <li><span class="function"><a href="function.preg-last-error.php" class="function" rel="rdfs-seeAlso">preg_last_error()</a> - Returns the error code of the last PCRE regex execution</span></li> <li><span class="function"><a href="function.preg-last-error-msg.php" class="function" rel="rdfs-seeAlso">preg_last_error_msg()</a> - Returns the error message of the last PCRE regex execution</span></li> </ul> </p> </div> </div> <div class="contribute"> <h3 class="title">Found A Problem?</h3> <div> </div> <div class="edit-bug"> <a href="https://github.com/php/doc-base/blob/master/README.md" title="This will take you to our contribution guidelines on GitHub" target="_blank" rel="noopener noreferrer">Learn How To Improve This Page</a> • <a href="https://github.com/php/doc-en/blob/master/reference/pcre/functions/preg-match.xml">Submit a Pull Request</a> • <a href="https://github.com/php/doc-en/issues/new?body=From%20manual%20page:%20https:%2F%2Fphp.net%2Ffunction.preg-match%0A%0A---">Report a Bug</a> </div> </div><section id="usernotes"> <div class="head"> <span class="action"><a href="/manual/add-note.php?sect=function.preg-match&repo=en&redirect=https://www.php.net/manual/en/function.preg-match.php">+<small>add a note</small></a></span> <h3 class="title">User Contributed Notes <span class="count">51 notes</span></h3> </div><div id="allnotes"> <div class="note" id="105924"> <div class="votes"> <div id="Vu105924"> <a href="/manual/vote-note.php?id=105924&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd105924"> <a href="/manual/vote-note.php?id=105924&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V105924" title="70% like this..."> 967 </div> </div> <a href="#105924" class="name"> <strong class="user"><em>force at md-t dot org</em></strong></a><a class="genanchor" href="#105924"> ¶</a><div class="date" title="2011-09-25 11:38"><strong>13 years ago</strong></div> <div class="text" id="Hcom105924"> <div class="phpcode"><code><span class="html">Simple regex<br /><br />Regex quick reference<br />[abc] A single character: a, b or c<br />[^abc] Any single character but a, b, or c<br />[a-z] Any single character in the range a-z<br />[a-zA-Z] Any single character in the range a-z or A-Z<br />^ Start of line<br />$ End of line<br />\A Start of string<br />\z End of string<br />. Any single character<br />\s Any whitespace character<br />\S Any non-whitespace character<br />\d Any digit<br />\D Any non-digit<br />\w Any word character (letter, number, underscore)<br />\W Any non-word character<br />\b Any word boundary character<br />(...) Capture everything enclosed<br />(a|b) a or b<br />a? Zero or one of a<br />a* Zero or more of a<br />a+ One or more of a<br />a{3} Exactly 3 of a<br />a{3,} 3 or more of a<br />a{3,6} Between 3 and 6 of a<br /><br />options: i case insensitive m make dot match newlines x ignore whitespace in regex o perform #{...} substitutions only once</span></code></div> </div> </div> <div class="note" id="111573"> <div class="votes"> <div id="Vu111573"> <a href="/manual/vote-note.php?id=111573&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd111573"> <a href="/manual/vote-note.php?id=111573&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V111573" title="73% like this..."> 45 </div> </div> <a href="#111573" class="name"> <strong class="user"><em>yofilter-php at yahoo dot co dot uk</em></strong></a><a class="genanchor" href="#111573"> ¶</a><div class="date" title="2013-03-05 01:48"><strong>12 years ago</strong></div> <div class="text" id="Hcom111573"> <div class="phpcode"><code><span class="html">There does not seem to be any mention of the PHP version of switches that can be used with regular expressions. <br /> <br />preg_match_all('/regular expr/sim',$text). <br /> <br />The s i m being the location for and available switches (I know about) <br />The i is to ignore letter cases (this is commonly known - I think) <br />The s tells the code NOT TO stop searching when it encounters \n (line break) - this is important with multi-line entries for example text from an editor that needs search. <br />The m tells the code it is a multi-line entry, but importantly allows the use of ^ and $ to work when showing start and end. <br /> <br />I am hoping this will save someone from the 4 hours of torture that I endured, trying to workout this issue.</span></code></div> </div> </div> <div class="note" id="103015"> <div class="votes"> <div id="Vu103015"> <a href="/manual/vote-note.php?id=103015&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd103015"> <a href="/manual/vote-note.php?id=103015&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V103015" title="69% like this..."> 111 </div> </div> <a href="#103015" class="name"> <strong class="user"><em>MrBull</em></strong></a><a class="genanchor" href="#103015"> ¶</a><div class="date" title="2011-03-20 07:32"><strong>14 years ago</strong></div> <div class="text" id="Hcom103015"> <div class="phpcode"><code><span class="html">Sometimes its useful to negate a string. The first method which comes to mind to do this is: [^(string)] but this of course won't work. There is a solution, but it is not very well known. This is the simple piece of code on how a negation of a string is done:<br /><br />(?:(?!string).)<br /><br />?: makes a subpattern (see <a href="http://www.php.net/manual/en/regexp.reference.subpatterns.php" rel="nofollow" target="_blank">http://www.php.net/manual/en/regexp.reference.subpatterns.php</a>) and ?! is a negative look ahead. You put the negative look ahead in front of the dot because you want the regex engine to first check if there is an occurrence of the string you are negating. Only if it is not there, you want to match an arbitrary character.<br /><br />Hope this helps some ppl.</span></code></div> </div> </div> <div class="note" id="94424"> <div class="votes"> <div id="Vu94424"> <a href="/manual/vote-note.php?id=94424&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd94424"> <a href="/manual/vote-note.php?id=94424&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V94424" title="70% like this..."> 52 </div> </div> <a href="#94424" class="name"> <strong class="user"><em>ruakuu at NOSPAM dot com</em></strong></a><a class="genanchor" href="#94424"> ¶</a><div class="date" title="2009-11-03 09:32"><strong>15 years ago</strong></div> <div class="text" id="Hcom94424"> <div class="phpcode"><code><span class="html">Was working on a site that needed japanese and alphabetic letters and needed to <br />validate input using preg_match, I tried using \p{script} but didn't work:<br /><br /><span class="default"><?php<br />$pattern </span><span class="keyword">=</span><span class="string">'/^([-a-zA-Z0-9_\p{Katakana}\p{Hiragana}\p{Han}]*)$/u'</span><span class="keyword">; </span><span class="comment">// Didn't work<br /></span><span class="default">?><br /></span><br />So I tried with ranges and it worked:<br /><br /><span class="default"><?php<br />$pattern </span><span class="keyword">=</span><span class="string">'/^[-a-zA-Z0-9_\x{30A0}-\x{30FF}'<br /> </span><span class="keyword">.</span><span class="string">'\x{3040}-\x{309F}\x{4E00}-\x{9FBF}\s]*$/u'</span><span class="keyword">;<br /></span><span class="default">$match_string </span><span class="keyword">= </span><span class="string">'印刷最安 ニキビ跡除去 ゲームボーイ'</span><span class="keyword">;<br /><br />if (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="default">$pattern</span><span class="keyword">, </span><span class="default">$match_string</span><span class="keyword">)) {<br /> echo </span><span class="string">"Found - pattern </span><span class="default">$pattern</span><span class="string">"</span><span class="keyword">;<br />} else {<br /> echo </span><span class="string">"Not found - pattern </span><span class="default">$pattern</span><span class="string">"</span><span class="keyword">;<br />}<br /></span><span class="default">?><br /></span><br />U+4E00–U+9FBF Kanji<br />U+3040–U+309F Hiragana<br />U+30A0–U+30FF Katakana<br /><br />Hope its useful, it took me several hours to figure it out.</span></code></div> </div> </div> <div class="note" id="95828"> <div class="votes"> <div id="Vu95828"> <a href="/manual/vote-note.php?id=95828&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd95828"> <a href="/manual/vote-note.php?id=95828&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V95828" title="69% like this..."> 75 </div> </div> <a href="#95828" class="name"> <strong class="user"><em>cebelab at gmail dot com</em></strong></a><a class="genanchor" href="#95828"> ¶</a><div class="date" title="2010-01-23 10:43"><strong>15 years ago</strong></div> <div class="text" id="Hcom95828"> <div class="phpcode"><code><span class="html">I noticed that in order to deal with UTF-8 texts, without having to recompile php with the PCRE UTF-8 flag enabled, you can just add the following sequence at the start of your pattern: (*UTF8)<br /><br />for instance : '#(*UTF8)[[:alnum:]]#' will return TRUE for 'é' where '#[[:alnum:]]#' will return FALSE<br /><br />found this very very useful tip after hours of research over the web directly in pcre website right here : <a href="http://www.pcre.org/pcre.txt" rel="nofollow" target="_blank">http://www.pcre.org/pcre.txt</a><br />there are many further informations about UTF-8 support in the lib<br /><br />hop that will help!<br /><br />--<br />cedric</span></code></div> </div> </div> <div class="note" id="125796"> <div class="votes"> <div id="Vu125796"> <a href="/manual/vote-note.php?id=125796&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd125796"> <a href="/manual/vote-note.php?id=125796&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V125796" title="66% like this..."> 1 </div> </div> <a href="#125796" class="name"> <strong class="user"><em>matt at proweb dot co dot uk</em></strong></a><a class="genanchor" href="#125796"> ¶</a><div class="date" title="2021-02-08 12:07"><strong>4 years ago</strong></div> <div class="text" id="Hcom125796"> <div class="phpcode"><code><span class="html">pcre2-migration<br /><br />Status: Implemented (in PHP 7.3)<br /><br />SELinux will prevent PREG_* functions from working<br /><br />Feb 8 12:40:51 servername setroubleshoot: SELinux is preventing httpd from using the execmem access on a process. <br /><br />you need to add preg.jit=0 to php.ini or init_set('preg.jit', 0) if you can't do that<br /><br />try the [PCRE] section so you can find it</span></code></div> </div> </div> <div class="note" id="112770"> <div class="votes"> <div id="Vu112770"> <a href="/manual/vote-note.php?id=112770&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd112770"> <a href="/manual/vote-note.php?id=112770&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V112770" title="65% like this..."> 7 </div> </div> <a href="#112770" class="name"> <strong class="user"><em>asdfasdasad34535 at iflow dot at</em></strong></a><a class="genanchor" href="#112770"> ¶</a><div class="date" title="2013-07-21 09:07"><strong>11 years ago</strong></div> <div class="text" id="Hcom112770"> <div class="phpcode"><code><span class="html">Attention! PREG_OFFSET_CAPTURE not UTF-8 aware when using u modifier<br />and it's not a but, it's a feature:<br /><a href="https://bugs.php.net/bug.php?id=37391" rel="nofollow" target="_blank">https://bugs.php.net/bug.php?id=37391</a><br /><br />Possible workaround: Use mb_strpos to get the correct offset, instead of the flag.<br /><br /> UTF-8 support would be nice.</span></code></div> </div> </div> <div class="note" id="105185"> <div class="votes"> <div id="Vu105185"> <a href="/manual/vote-note.php?id=105185&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd105185"> <a href="/manual/vote-note.php?id=105185&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V105185" title="63% like this..."> 40 </div> </div> <a href="#105185" class="name"> <strong class="user"><em>mohammad40g at gmail dot com</em></strong></a><a class="genanchor" href="#105185"> ¶</a><div class="date" title="2011-08-01 09:23"><strong>13 years ago</strong></div> <div class="text" id="Hcom105185"> <div class="phpcode"><code><span class="html">This sample is for checking persian character:<br /><br /><span class="default"><?php<br /> preg_match</span><span class="keyword">(</span><span class="string">"/[\x{0600}-\x{06FF}\x]{1,32}/u"</span><span class="keyword">, </span><span class="string">'محمد'</span><span class="keyword">);<br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="105362"> <div class="votes"> <div id="Vu105362"> <a href="/manual/vote-note.php?id=105362&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd105362"> <a href="/manual/vote-note.php?id=105362&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V105362" title="64% like this..."> 5 </div> </div> <a href="#105362" class="name"> <strong class="user"><em>workhorse at op dot pl</em></strong></a><a class="genanchor" href="#105362"> ¶</a><div class="date" title="2011-08-11 12:53"><strong>13 years ago</strong></div> <div class="text" id="Hcom105362"> <div class="phpcode"><code><span class="html">Preg_match returns empty result trying to validate $subject with carriege returns (/n/r).<br />To solve it one need to use /s modifier in $pattern string.<br /><span class="default"><?php<br />$pattern</span><span class="keyword">=</span><span class="string">'/.*/s'</span><span class="keyword">;<br /></span><span class="default">$valid</span><span class="keyword">=</span><span class="default">preg_match</span><span class="keyword">(</span><span class="default">$pattern</span><span class="keyword">, </span><span class="default">$subject</span><span class="keyword">, </span><span class="default">$match</span><span class="keyword">);<br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="102214"> <div class="votes"> <div id="Vu102214"> <a href="/manual/vote-note.php?id=102214&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd102214"> <a href="/manual/vote-note.php?id=102214&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V102214" title="63% like this..."> 32 </div> </div> <a href="#102214" class="name"> <strong class="user"><em>arash dot hemmat at gmail dot com</em></strong></a><a class="genanchor" href="#102214"> ¶</a><div class="date" title="2011-02-02 07:15"><strong>14 years ago</strong></div> <div class="text" id="Hcom102214"> <div class="phpcode"><code><span class="html">For those who search for a unicode regular expression example using preg_match here it is:<br /><br />Check for Persian digits<br />preg_match( "/[^\x{06F0}-\x{06F9}\x]+/u" , '۱۲۳۴۵۶۷۸۹۰' );</span></code></div> </div> </div> <div class="note" id="93332"> <div class="votes"> <div id="Vu93332"> <a href="/manual/vote-note.php?id=93332&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd93332"> <a href="/manual/vote-note.php?id=93332&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V93332" title="64% like this..."> 14 </div> </div> <a href="#93332" class="name"> <strong class="user"><em>luc _ santeramo at t yahoo dot com</em></strong></a><a class="genanchor" href="#93332"> ¶</a><div class="date" title="2009-09-03 07:46"><strong>15 years ago</strong></div> <div class="text" id="Hcom93332"> <div class="phpcode"><code><span class="html">If you want to validate an email in one line, use filter_var() function !<br /><a href="http://fr.php.net/manual/en/function.filter-var.php" rel="nofollow" target="_blank">http://fr.php.net/manual/en/function.filter-var.php</a><br /><br />easy use, as described in the document example :<br />var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));</span></code></div> </div> </div> <div class="note" id="83446"> <div class="votes"> <div id="Vu83446"> <a href="/manual/vote-note.php?id=83446&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd83446"> <a href="/manual/vote-note.php?id=83446&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V83446" title="63% like this..."> 29 </div> </div> <a href="#83446" class="name"> <strong class="user"><em>jonathan dot lydall at gmail dot removethispart dot com</em></strong></a><a class="genanchor" href="#83446"> ¶</a><div class="date" title="2008-05-26 12:50"><strong>16 years ago</strong></div> <div class="text" id="Hcom83446"> <div class="phpcode"><code><span class="html">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 (<a href="http://www.php.net/manual/en/function.filter-var.php" rel="nofollow" target="_blank">http://www.php.net/manual/en/function.filter-var.php</a>):<br /><br /><span class="default"><?php<br />$email </span><span class="keyword">= </span><span class="string">"someone@domain .local"</span><span class="keyword">;<br /><br />if(!</span><span class="default">filter_var</span><span class="keyword">(</span><span class="default">$email</span><span class="keyword">, </span><span class="default">FILTER_VALIDATE_EMAIL</span><span class="keyword">)) {<br /> echo </span><span class="string">"E-mail is not valid"</span><span class="keyword">;<br />} else {<br /> echo </span><span class="string">"E-mail is valid"</span><span class="keyword">;<br />}<br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="93824"> <div class="votes"> <div id="Vu93824"> <a href="/manual/vote-note.php?id=93824&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd93824"> <a href="/manual/vote-note.php?id=93824&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V93824" title="62% like this..."> 18 </div> </div> <a href="#93824" class="name"> <strong class="user"><em>splattermania at freenet dot de</em></strong></a><a class="genanchor" href="#93824"> ¶</a><div class="date" title="2009-10-01 05:01"><strong>15 years ago</strong></div> <div class="text" id="Hcom93824"> <div class="phpcode"><code><span class="html">As I wasted lots of time finding a REAL regex for URLs and resulted in building it on my own, I now have found one, that seems to work for all kinds of urls: <br /> <br /><span class="default"><?php <br /> $regex </span><span class="keyword">= </span><span class="string">"((https?|ftp)\:\/\/)?"</span><span class="keyword">; </span><span class="comment">// SCHEME <br /> </span><span class="default">$regex </span><span class="keyword">.= </span><span class="string">"([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"</span><span class="keyword">; </span><span class="comment">// User and Pass <br /> </span><span class="default">$regex </span><span class="keyword">.= </span><span class="string">"([a-z0-9-.]*)\.([a-z]{2,3})"</span><span class="keyword">; </span><span class="comment">// Host or IP <br /> </span><span class="default">$regex </span><span class="keyword">.= </span><span class="string">"(\:[0-9]{2,5})?"</span><span class="keyword">; </span><span class="comment">// Port <br /> </span><span class="default">$regex </span><span class="keyword">.= </span><span class="string">"(\/([a-z0-9+\$_-]\.?)+)*\/?"</span><span class="keyword">; </span><span class="comment">// Path <br /> </span><span class="default">$regex </span><span class="keyword">.= </span><span class="string">"(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"</span><span class="keyword">; </span><span class="comment">// GET Query <br /> </span><span class="default">$regex </span><span class="keyword">.= </span><span class="string">"(#[a-z_.-][a-z0-9+\$_.-]*)?"</span><span class="keyword">; </span><span class="comment">// Anchor <br /></span><span class="default">?> <br /></span> <br />Then, the correct way to check against the regex ist as follows: <br /> <br /><span class="default"><?php <br /> </span><span class="keyword">if(</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"/^</span><span class="default">$regex</span><span class="string">$/"</span><span class="keyword">, </span><span class="default">$url</span><span class="keyword">)) <br /> { <br /> return </span><span class="default">true</span><span class="keyword">; <br /> } <br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="108209"> <div class="votes"> <div id="Vu108209"> <a href="/manual/vote-note.php?id=108209&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd108209"> <a href="/manual/vote-note.php?id=108209&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V108209" title="62% like this..."> 11 </div> </div> <a href="#108209" class="name"> <strong class="user"><em>ulli dot luftpumpe at murkymind dot de</em></strong></a><a class="genanchor" href="#108209"> ¶</a><div class="date" title="2012-04-07 10:32"><strong>13 years ago</strong></div> <div class="text" id="Hcom108209"> <div class="phpcode"><code><span class="html">Matching a backslash character can be confusing, because double escaping is needed in the pattern: first for PHP, second for the regex engine<br /><span class="default"><?php<br /></span><span class="comment">//match newline control character:<br /></span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/\n/'</span><span class="keyword">,</span><span class="string">'\n'</span><span class="keyword">); </span><span class="comment">//pattern matches and is stored as control character 0x0A in the pattern string<br /></span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/\\\n/'</span><span class="keyword">,</span><span class="string">'\n'</span><span class="keyword">); </span><span class="comment">//very same match, but is stored escaped as 0x5C,0x6E in the pattern string<br /><br />//trying to match "\'" (2 characters) in a text file, '\\\'' as PHP string:<br /></span><span class="default">$subject </span><span class="keyword">= </span><span class="default">file_get_contents</span><span class="keyword">(</span><span class="string">'myfile.txt'</span><span class="keyword">);<br /></span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/\\\'/'</span><span class="keyword">,</span><span class="default">$subject</span><span class="keyword">); </span><span class="comment">//DOESN'T MATCH!!! stored as 0x5C,0x27 (escaped apostrophe), this only matches apostrophe<br /></span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/\\\\\'/'</span><span class="keyword">,</span><span class="default">$subject</span><span class="keyword">); </span><span class="comment">//matches, stored as 0x5C,0x5C,0x27 (escaped backslash and unescaped apostrophe)<br /></span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/\\\\\\\/'</span><span class="keyword">,</span><span class="default">$subject</span><span class="keyword">); </span><span class="comment">//also matches, stored as 0x5C,0x5C,0x5C,0x27 (escaped backslash and escaped apostrophe)<br /><br />//matching "\n" (2 characters):<br /></span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/\\\\n/'</span><span class="keyword">,</span><span class="string">'\\n'</span><span class="keyword">);<br /></span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/\\\n/'</span><span class="keyword">,</span><span class="string">'\\n'</span><span class="keyword">); </span><span class="comment">//same match - 3 backslashes are interpreted as 2 in PHP, if the following character is not escapeable<br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="89418"> <div class="votes"> <div id="Vu89418"> <a href="/manual/vote-note.php?id=89418&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd89418"> <a href="/manual/vote-note.php?id=89418&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V89418" title="61% like this..."> 17 </div> </div> <a href="#89418" class="name"> <strong class="user"><em>daevid at daevid dot com</em></strong></a><a class="genanchor" href="#89418"> ¶</a><div class="date" title="2009-03-06 03:18"><strong>16 years ago</strong></div> <div class="text" id="Hcom89418"> <div class="phpcode"><code><span class="html">I just learned about named groups from a Python friend today and was curious if PHP supported them, guess what -- it does!!!<br /><br /><a href="http://www.regular-expressions.info/named.html" rel="nofollow" target="_blank">http://www.regular-expressions.info/named.html</a><br /><br /><span class="default"><?php<br /> preg_match</span><span class="keyword">(</span><span class="string">"/(?P<foo>abc)(.*)(?P<bar>xyz)/"</span><span class="keyword">,<br /> </span><span class="string">'abcdefghijklmnopqrstuvwxyz'</span><span class="keyword">,<br /> </span><span class="default">$matches</span><span class="keyword">);<br /> </span><span class="default">print_r</span><span class="keyword">(</span><span class="default">$matches</span><span class="keyword">);<br /></span><span class="default">?><br /></span><br />will produce: <br /><br />Array<br />(<br /> [0] => abcdefghijklmnopqrstuvwxyz<br /> [foo] => abc<br /> [1] => abc<br /> [2] => defghijklmnopqrstuvw<br /> [bar] => xyz<br /> [3] => xyz<br />)<br /><br />Note that you actually get the named group as well as the numerical key<br />value too, so if you do use them, and you're counting array elements, be<br />aware that your array might be bigger than you initially expect it to be.</span></code></div> </div> </div> <div class="note" id="121677"> <div class="votes"> <div id="Vu121677"> <a href="/manual/vote-note.php?id=121677&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd121677"> <a href="/manual/vote-note.php?id=121677&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V121677" title="60% like this..."> 2 </div> </div> <a href="#121677" class="name"> <strong class="user"><em>danielrydell at gmail dot com</em></strong></a><a class="genanchor" href="#121677"> ¶</a><div class="date" title="2017-09-24 01:25"><strong>7 years ago</strong></div> <div class="text" id="Hcom121677"> <div class="phpcode"><code><span class="html">When trying to match accented characters, such as those found in Spanish, there seems to be a different internal interpretation when using character classes. So the best way is to add the u option (for unicode) after the delimiters.<br /><br /><span class="default"><?php<br /><br /></span><span class="comment">//echoes 1 (adding u would not alter the result)<br /></span><span class="keyword">echo </span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/^áéíóúñ$/'</span><span class="keyword">, </span><span class="string">'áéíóúñ'</span><span class="keyword">);<br /><br /></span><span class="comment">//echoes 0 (unless with [ó]+ or [ó]* or adding u)<br /></span><span class="keyword">echo </span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/^áéí[ó]úñ$/'</span><span class="keyword">, </span><span class="string">'áéíóúñ'</span><span class="keyword">);<br /><br /></span><span class="comment">//so to match 'espana' or 'españa', add u or this won't match<br />//echoes 1<br /></span><span class="keyword">echo </span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/^espa[nñ]a$/u'</span><span class="keyword">, </span><span class="string">'españa'</span><span class="keyword">);<br /><br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="121555"> <div class="votes"> <div id="Vu121555"> <a href="/manual/vote-note.php?id=121555&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd121555"> <a href="/manual/vote-note.php?id=121555&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V121555" title="60% like this..."> 1 </div> </div> <a href="#121555" class="name"> <strong class="user"><em>chat dot noir at arcor dot de</em></strong></a><a class="genanchor" href="#121555"> ¶</a><div class="date" title="2017-08-23 01:56"><strong>7 years ago</strong></div> <div class="text" id="Hcom121555"> <div class="phpcode"><code><span class="html">Note that if a parenthesed group is not matched, its key may or may not be present in $matches. For instance,<br /><br /><span class="default"><?php preg_match</span><span class="keyword">(</span><span class="string">'/(foo)?(bar)?(baz)?/'</span><span class="keyword">, </span><span class="string">'bar'</span><span class="keyword">, </span><span class="default">$matches</span><span class="keyword">);<br /></span><span class="default">print_r</span><span class="keyword">(</span><span class="default">$matches</span><span class="keyword">); <br /><br /></span><span class="comment">// outputs<br />// Array<br />// (<br />// [0] => bar<br />// [1] => <br />// [2] => bar<br />// )<br /></span><span class="default">?><br /></span>Note that there is no element with key '3' in $matches, but an element with key '1' (the empty string). This inconsistent behavior also applies to named groups.</span></code></div> </div> </div> <div class="note" id="107454"> <div class="votes"> <div id="Vu107454"> <a href="/manual/vote-note.php?id=107454&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd107454"> <a href="/manual/vote-note.php?id=107454&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V107454" title="60% like this..."> 3 </div> </div> <a href="#107454" class="name"> <strong class="user"><em>Nimja</em></strong></a><a class="genanchor" href="#107454"> ¶</a><div class="date" title="2012-02-10 11:12"><strong>13 years ago</strong></div> <div class="text" id="Hcom107454"> <div class="phpcode"><code><span class="html">When using a 'bad words reject string' filter, preg_match is MUCH faster than strpos / stripos. Because in the other cases, you would need to do a foreach for each word. With efficient programming, the foreach is ONLY faster when the first word in the ban-list is found.<br /><br />(for 12 words, 100,000 iterations, no word found)<br />stripos - Taken 1.4876 seconds.<br />strpos - Taken 1.4207 seconds.<br />preg_match - Taken 0.189 seconds.<br /><br />Interesting fact:<br />With long words ('averylongwordtospitepreg'), the difference is only much less. Only about a 2/3rd of the time instead of 1/6th<br /><br /><span class="default"><?php<br /><br />$words </span><span class="keyword">= array(</span><span class="string">'word1'</span><span class="keyword">, </span><span class="string">'word2'</span><span class="keyword">, </span><span class="string">'word3'</span><span class="keyword">, </span><span class="string">'word4'</span><span class="keyword">, </span><span class="string">'word5'</span><span class="keyword">, </span><span class="string">'word6'</span><span class="keyword">, </span><span class="string">'word7'</span><span class="keyword">, </span><span class="string">'word8'</span><span class="keyword">, </span><span class="string">'word9'</span><span class="keyword">, </span><span class="string">'word10'</span><span class="keyword">, </span><span class="string">'word11'</span><span class="keyword">, </span><span class="string">'word12' </span><span class="keyword">);<br /></span><span class="default">$teststring </span><span class="keyword">= </span><span class="string">'ThIs Is A tEsTsTrInG fOr TeStInG.'</span><span class="keyword">;<br /></span><span class="default">$count </span><span class="keyword">= </span><span class="default">100000</span><span class="keyword">;<br /></span><span class="default">$find </span><span class="keyword">= </span><span class="default">0</span><span class="keyword">;<br /><br /></span><span class="default">$start </span><span class="keyword">= </span><span class="default">microtime</span><span class="keyword">(</span><span class="default">TRUE</span><span class="keyword">);<br />for (</span><span class="default">$i </span><span class="keyword">= </span><span class="default">0</span><span class="keyword">; </span><span class="default">$i </span><span class="keyword">< </span><span class="default">$count</span><span class="keyword">; </span><span class="default">$i</span><span class="keyword">++) {<br /> foreach (</span><span class="default">$words </span><span class="keyword">as </span><span class="default">$word</span><span class="keyword">) {<br /> if (</span><span class="default">stripos</span><span class="keyword">(</span><span class="default">$teststring</span><span class="keyword">, </span><span class="default">$word</span><span class="keyword">) !== </span><span class="default">FALSE</span><span class="keyword">) {<br /> </span><span class="default">$find</span><span class="keyword">++;<br /> break;<br /> }<br /> }<br />}<br />echo </span><span class="string">'stripos - Taken ' </span><span class="keyword">. </span><span class="default">round</span><span class="keyword">(</span><span class="default">microtime</span><span class="keyword">(</span><span class="default">TRUE</span><span class="keyword">) - </span><span class="default">$start</span><span class="keyword">, </span><span class="default">4</span><span class="keyword">) . </span><span class="string">' seconds.' </span><span class="keyword">. </span><span class="default">PHP_EOL</span><span class="keyword">;<br /><br /></span><span class="default">$start </span><span class="keyword">= </span><span class="default">microtime</span><span class="keyword">(</span><span class="default">TRUE</span><span class="keyword">);<br />for (</span><span class="default">$i </span><span class="keyword">= </span><span class="default">0</span><span class="keyword">; </span><span class="default">$i </span><span class="keyword">< </span><span class="default">$count</span><span class="keyword">; </span><span class="default">$i</span><span class="keyword">++) {<br /> foreach (</span><span class="default">$words </span><span class="keyword">as </span><span class="default">$word</span><span class="keyword">) {<br /> if (</span><span class="default">strpos</span><span class="keyword">(</span><span class="default">$teststring</span><span class="keyword">, </span><span class="default">$word</span><span class="keyword">) !== </span><span class="default">FALSE</span><span class="keyword">) {<br /> </span><span class="default">$find</span><span class="keyword">++;<br /> break;<br /> }<br /> }<br />}<br />echo </span><span class="string">'strpos - Taken ' </span><span class="keyword">. </span><span class="default">round</span><span class="keyword">(</span><span class="default">microtime</span><span class="keyword">(</span><span class="default">TRUE</span><span class="keyword">) - </span><span class="default">$start</span><span class="keyword">, </span><span class="default">4</span><span class="keyword">) . </span><span class="string">' seconds.' </span><span class="keyword">. </span><span class="default">PHP_EOL</span><span class="keyword">;<br /><br /></span><span class="default">$start </span><span class="keyword">= </span><span class="default">microtime</span><span class="keyword">(</span><span class="default">TRUE</span><span class="keyword">);<br /></span><span class="default">$pattern </span><span class="keyword">= </span><span class="string">'/'</span><span class="keyword">;<br /></span><span class="default">$div </span><span class="keyword">= </span><span class="string">''</span><span class="keyword">;<br />foreach (</span><span class="default">$words </span><span class="keyword">as </span><span class="default">$word</span><span class="keyword">) {<br /> </span><span class="default">$pattern </span><span class="keyword">.= </span><span class="default">$div </span><span class="keyword">. </span><span class="default">preg_quote</span><span class="keyword">(</span><span class="default">$word</span><span class="keyword">);<br /> </span><span class="default">$div </span><span class="keyword">= </span><span class="string">'|'</span><span class="keyword">;<br />}<br /></span><span class="default">$pattern </span><span class="keyword">.= </span><span class="string">'/i'</span><span class="keyword">;<br /></span><span class="comment">//Pattern could easily be done somewhere else if words are static.<br /></span><span class="keyword">for (</span><span class="default">$i </span><span class="keyword">= </span><span class="default">0</span><span class="keyword">; </span><span class="default">$i </span><span class="keyword">< </span><span class="default">$count</span><span class="keyword">; </span><span class="default">$i</span><span class="keyword">++) {<br /> if (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="default">$pattern</span><span class="keyword">, </span><span class="default">$teststring</span><span class="keyword">)) {<br /> </span><span class="default">$find</span><span class="keyword">++;<br /> }<br />}<br /></span><span class="default">$end </span><span class="keyword">= </span><span class="default">microtime</span><span class="keyword">(</span><span class="default">TRUE</span><span class="keyword">);<br />echo </span><span class="string">'preg_match - Taken ' </span><span class="keyword">. </span><span class="default">round</span><span class="keyword">(</span><span class="default">$end </span><span class="keyword">- </span><span class="default">$start</span><span class="keyword">, </span><span class="default">4</span><span class="keyword">) . </span><span class="string">' seconds.' </span><span class="keyword">. </span><span class="default">PHP_EOL</span><span class="keyword">;<br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="96830"> <div class="votes"> <div id="Vu96830"> <a href="/manual/vote-note.php?id=96830&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd96830"> <a href="/manual/vote-note.php?id=96830&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V96830" title="60% like this..."> 10 </div> </div> <a href="#96830" class="name"> <strong class="user"><em>Kae Cyphet</em></strong></a><a class="genanchor" href="#96830"> ¶</a><div class="date" title="2010-03-17 06:29"><strong>15 years ago</strong></div> <div class="text" id="Hcom96830"> <div class="phpcode"><code><span class="html">for those coming over from ereg, preg_match can be quite intimidating. to get started here is a migration tip. <br /> <br /><span class="default"><?php <br /></span><span class="keyword">if(</span><span class="default">ereg</span><span class="keyword">(</span><span class="string">'[^0-9A-Za-z]'</span><span class="keyword">,</span><span class="default">$test_string</span><span class="keyword">)) </span><span class="comment">// will be true if characters arnt 0-9, A-Z or a-z. <br /> <br /></span><span class="keyword">if(</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/[^0-9A-Za-z]/'</span><span class="keyword">,</span><span class="default">$test_string</span><span class="keyword">)) </span><span class="comment">// this is the preg_match version. the /'s are now required. <br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="101618"> <div class="votes"> <div id="Vu101618"> <a href="/manual/vote-note.php?id=101618&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd101618"> <a href="/manual/vote-note.php?id=101618&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V101618" title="60% like this..."> 6 </div> </div> <a href="#101618" class="name"> <strong class="user"><em>sainnr at gmail dot com</em></strong></a><a class="genanchor" href="#101618"> ¶</a><div class="date" title="2010-12-30 06:12"><strong>14 years ago</strong></div> <div class="text" id="Hcom101618"> <div class="phpcode"><code><span class="html">This sample regexp may be useful if you are working with DB field types. <br /><br />(?P<type>\w+)($|\((?P<length>(\d+|(.*)))\))<br /><br />For example, if you are have a such type as "varchar(255)" or "text", the next fragment<br /><br /><span class="default"><?php<br /> $type </span><span class="keyword">= </span><span class="string">'varchar(255)'</span><span class="keyword">; </span><span class="comment">// type of field<br /> </span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/(?P<type>\w+)($|\((?P<length>(\d+|(.*)))\))/'</span><span class="keyword">, </span><span class="default">$type</span><span class="keyword">, </span><span class="default">$field</span><span class="keyword">);<br /> </span><span class="default">print_r</span><span class="keyword">(</span><span class="default">$field</span><span class="keyword">);<br /></span><span class="default">?><br /></span><br />will output something like this:<br />Array ( [0] => varchar(255) [type] => varchar [1] => varchar [2] => (255) [length] => 255 [3] => 255 [4] => 255 )</span></code></div> </div> </div> <div class="note" id="101575"> <div class="votes"> <div id="Vu101575"> <a href="/manual/vote-note.php?id=101575&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd101575"> <a href="/manual/vote-note.php?id=101575&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V101575" title="60% like this..."> 6 </div> </div> <a href="#101575" class="name"> <strong class="user"><em>ian_channing at hotmail dot com</em></strong></a><a class="genanchor" href="#101575"> ¶</a><div class="date" title="2010-12-27 01:55"><strong>14 years ago</strong></div> <div class="text" id="Hcom101575"> <div class="phpcode"><code><span class="html">When trying to check a file path that could be windows or unix it took me quite a few tries to get the escape characters right.<br /><br />The Unix directory separator must be escaped once and the windows directory separator must be escaped twice.<br /><br />This will match path/to/file and path\to\file.exe<br /><br />preg_match('/^[a-z0-9_.\/\\\]*$/i', $file_string);</span></code></div> </div> </div> <div class="note" id="111300"> <div class="votes"> <div id="Vu111300"> <a href="/manual/vote-note.php?id=111300&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd111300"> <a href="/manual/vote-note.php?id=111300&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V111300" title="58% like this..."> 16 </div> </div> <a href="#111300" class="name"> <strong class="user"><em>Yousef Ismaeil Cliprz</em></strong></a><a class="genanchor" href="#111300"> ¶</a><div class="date" title="2013-02-04 01:31"><strong>12 years ago</strong></div> <div class="text" id="Hcom111300"> <div class="phpcode"><code><span class="html">Some times a Hacker use a php file or shell as a image to hack your website. so if you try to use move_uploaded_file() function as in example to allow for users to upload files, you must check if this file contains a bad codes or not so we use this function. preg match<br /><br />in this function we use<br /><br />unlink() - <a href="http://php.net/unlink" rel="nofollow" target="_blank">http://php.net/unlink</a><br /><br />after you upload file check a file with below function. <br /><br /><span class="default"><?php<br /><br /></span><span class="comment">/**<br /> * A simple function to check file from bad codes.<br /> *<br /> * @param (string) $file - file path.<br /> * @author Yousef Ismaeil - Cliprz[at]gmail[dot]com.<br /> */<br /></span><span class="keyword">function </span><span class="default">is_clean_file </span><span class="keyword">(</span><span class="default">$file</span><span class="keyword">)<br />{<br /> if (</span><span class="default">file_exists</span><span class="keyword">(</span><span class="default">$file</span><span class="keyword">))<br /> {<br /> </span><span class="default">$contents </span><span class="keyword">= </span><span class="default">file_get_contents</span><span class="keyword">(</span><span class="default">$file</span><span class="keyword">);<br /> }<br /> else<br /> {<br /> exit(</span><span class="default">$file</span><span class="keyword">.</span><span class="string">" Not exists."</span><span class="keyword">);<br /> }<br /><br /> if (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/(base64_|eval|system|shell_|exec|php_)/i'</span><span class="keyword">,</span><span class="default">$contents</span><span class="keyword">))<br /> {<br /> return </span><span class="default">true</span><span class="keyword">;<br /> }<br /> else if (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"#&\#x([0-9a-f]+);#i"</span><span class="keyword">, </span><span class="default">$contents</span><span class="keyword">))<br /> {<br /> return </span><span class="default">true</span><span class="keyword">;<br /> }<br /> elseif (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'#&\#([0-9]+);#i'</span><span class="keyword">, </span><span class="default">$contents</span><span class="keyword">))<br /> {<br /> return </span><span class="default">true</span><span class="keyword">;<br /> }<br /> elseif (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"#([a-z]*)=([\`\'\"]*)script:#iU"</span><span class="keyword">, </span><span class="default">$contents</span><span class="keyword">))<br /> {<br /> return </span><span class="default">true</span><span class="keyword">;<br /> }<br /> elseif (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"#([a-z]*)=([\`\'\"]*)javascript:#iU"</span><span class="keyword">, </span><span class="default">$contents</span><span class="keyword">))<br /> {<br /> return </span><span class="default">true</span><span class="keyword">;<br /> }<br /> elseif (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"#([a-z]*)=([\'\"]*)vbscript:#iU"</span><span class="keyword">, </span><span class="default">$contents</span><span class="keyword">))<br /> {<br /> return </span><span class="default">true</span><span class="keyword">;<br /> }<br /> elseif (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"#(<[^>]+)style=([\`\'\"]*).*expression\([^>]*>#iU"</span><span class="keyword">, </span><span class="default">$contents</span><span class="keyword">))<br /> {<br /> return </span><span class="default">true</span><span class="keyword">;<br /> }<br /> elseif (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"#(<[^>]+)style=([\`\'\"]*).*behaviour\([^>]*>#iU"</span><span class="keyword">, </span><span class="default">$contents</span><span class="keyword">))<br /> {<br /> return </span><span class="default">true</span><span class="keyword">;<br /> }<br /> elseif (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"#</*(applet|link|style|script|iframe|frame|frameset|html|body|title|div|p|form)[^>]*>#i"</span><span class="keyword">, </span><span class="default">$contents</span><span class="keyword">))<br /> {<br /> return </span><span class="default">true</span><span class="keyword">;<br /> }<br /> else<br /> {<br /> return </span><span class="default">false</span><span class="keyword">;<br /> }<br />}<br /></span><span class="default">?><br /></span><br />Use<br /><br /><span class="default"><?php<br /></span><span class="comment">// If image contains a bad codes<br /></span><span class="default">$image </span><span class="keyword">= </span><span class="string">"simpleimage.png"</span><span class="keyword">;<br /><br />if (</span><span class="default">is_clean_file</span><span class="keyword">(</span><span class="default">$image</span><span class="keyword">))<br />{<br /> echo </span><span class="string">"Bad codes this is not image"</span><span class="keyword">;<br /> </span><span class="default">unlink</span><span class="keyword">(</span><span class="default">$image</span><span class="keyword">);<br />}<br />else<br />{<br /> echo </span><span class="string">"This is a real image."</span><span class="keyword">;<br />}<br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="106804"> <div class="votes"> <div id="Vu106804"> <a href="/manual/vote-note.php?id=106804&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd106804"> <a href="/manual/vote-note.php?id=106804&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V106804" title="59% like this..."> 7 </div> </div> <a href="#106804" class="name"> <strong class="user"><em>Jonny 5</em></strong></a><a class="genanchor" href="#106804"> ¶</a><div class="date" title="2011-12-07 09:55"><strong>13 years ago</strong></div> <div class="text" id="Hcom106804"> <div class="phpcode"><code><span class="html">Workaround for getting the offset in UTF-8 <br />(in some cases mb_strpos might be an option as well) <br /> <br /><span class="default"><?php <br /></span><span class="keyword">if(</span><span class="default">preg_match</span><span class="keyword">(</span><span class="default">$pattern</span><span class="keyword">,</span><span class="default">$haystack</span><span class="keyword">,</span><span class="default">$out</span><span class="keyword">,</span><span class="default">PREG_OFFSET_CAPTURE</span><span class="keyword">)) { <br /> </span><span class="default">$offset </span><span class="keyword">= </span><span class="default">strlen</span><span class="keyword">(</span><span class="default">utf8_decode</span><span class="keyword">(</span><span class="default">substr</span><span class="keyword">(</span><span class="default">$haystack</span><span class="keyword">,</span><span class="default">0</span><span class="keyword">,</span><span class="default">$out</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">][</span><span class="default">1</span><span class="keyword">]))); <br />} <br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="88587"> <div class="votes"> <div id="Vu88587"> <a href="/manual/vote-note.php?id=88587&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd88587"> <a href="/manual/vote-note.php?id=88587&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V88587" title="59% like this..."> 6 </div> </div> <a href="#88587" class="name"> <strong class="user"><em>akniep at rayo dot info</em></strong></a><a class="genanchor" href="#88587"> ¶</a><div class="date" title="2009-01-30 03:05"><strong>16 years ago</strong></div> <div class="text" id="Hcom88587"> <div class="phpcode"><code><span class="html">Bugs of preg_match (PHP-version 5.2.5)<br /><br />In most cases, the following example will show one of two PHP-bugs discovered with preg_match depending on your PHP-version and configuration.<br /><br /><span class="default"><?php<br /><br />$text </span><span class="keyword">= </span><span class="string">"test="</span><span class="keyword">;<br /></span><span class="comment">// creates a rather long text<br /></span><span class="keyword">for (</span><span class="default">$i </span><span class="keyword">= </span><span class="default">0</span><span class="keyword">; </span><span class="default">$i</span><span class="keyword">++ < </span><span class="default">100000</span><span class="keyword">;)<br /> </span><span class="default">$text </span><span class="keyword">.= </span><span class="string">"%AB"</span><span class="keyword">;<br /><br /></span><span class="comment">// a typical URL_query validity-checker (the pattern's function does not matter for this example)<br /></span><span class="default">$pattern </span><span class="keyword">= </span><span class="string">'/^(?:[;\/?:@&=+$,]|(?:[^\W_]|[-_.!~*\()\[\] ])|(?:%[\da-fA-F]{2}))*$/'</span><span class="keyword">;<br /> <br /></span><span class="default">var_dump</span><span class="keyword">( </span><span class="default">preg_match</span><span class="keyword">( </span><span class="default">$pattern</span><span class="keyword">, </span><span class="default">$text </span><span class="keyword">) );<br /><br /></span><span class="default">?><br /></span><br />Possible bug (1):<br />=============<br />On one of our Linux-Servers the above example crashes PHP-execution with a C(?) Segmentation Fault(!). This seems to be a known bug (see <a href="http://bugs.php.net/bug.php?id=40909" rel="nofollow" target="_blank">http://bugs.php.net/bug.php?id=40909</a>), but I don't know if it has been fixed, yet.<br />If you are looking for a work-around, the following code-snippet is what I found helpful. It wraps the possibly crashing preg_match call by decreasing the PCRE recursion limit in order to result in a Reg-Exp error instead of a PHP-crash.<br /><br /><span class="default"><?php<br /></span><span class="keyword">[...]<br /><br /></span><span class="comment">// decrease the PCRE recursion limit for the (possibly dangerous) preg_match call<br /></span><span class="default">$former_recursion_limit </span><span class="keyword">= </span><span class="default">ini_set</span><span class="keyword">( </span><span class="string">"pcre.recursion_limit"</span><span class="keyword">, </span><span class="default">10000 </span><span class="keyword">);<br /><br /></span><span class="comment">// the wrapped preg_match call<br /></span><span class="default">$result </span><span class="keyword">= </span><span class="default">preg_match</span><span class="keyword">( </span><span class="default">$pattern</span><span class="keyword">, </span><span class="default">$text </span><span class="keyword">);<br /><br /></span><span class="comment">// reset the PCRE recursion limit to its original value<br /></span><span class="default">ini_set</span><span class="keyword">( </span><span class="string">"pcre.recursion_limit"</span><span class="keyword">, </span><span class="default">$former_recursion_limit </span><span class="keyword">);<br /><br /></span><span class="comment">// if the reg-exp fails due to the decreased recursion limit we may not make any statement, but PHP-execution continues<br /></span><span class="keyword">if ( </span><span class="default">PREG_RECURSION_LIMIT_ERROR </span><span class="keyword">=== </span><span class="default">preg_last_error</span><span class="keyword">() )<br />{<br /> </span><span class="comment">// react on the failed regular expression here<br /> </span><span class="default">$result </span><span class="keyword">= [...];<br /> <br /> </span><span class="comment">// do logging or email-sending here<br /> </span><span class="keyword">[...]<br />} </span><span class="comment">//if<br /><br /></span><span class="default">?><br /></span><br />Possible bug (2):<br />=============<br />On one of our Windows-Servers the above example does not crash PHP, but (directly) hits the recursion-limit. Here, the problem is that preg_match does not return boolean(false) as expected by the description / manual of above.<br />In short, preg_match seems to return an int(0) instead of the expected boolean(false) if the regular expression could not be executed due to the PCRE recursion-limit. So, if preg_match results in int(0) you seem to have to check preg_last_error() if maybe an error occurred.</span></code></div> </div> </div> <div class="note" id="93043"> <div class="votes"> <div id="Vu93043"> <a href="/manual/vote-note.php?id=93043&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd93043"> <a href="/manual/vote-note.php?id=93043&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V93043" title="58% like this..."> 9 </div> </div> <a href="#93043" class="name"> <strong class="user"><em>ian_channing at hotmail dot com</em></strong></a><a class="genanchor" href="#93043"> ¶</a><div class="date" title="2009-08-20 06:13"><strong>15 years ago</strong></div> <div class="text" id="Hcom93043"> <div class="phpcode"><code><span class="html">This is a function that uses regular expressions to match against the various VAT formats required across the EU. <br /> <br /><span class="default"><?php <br /></span><span class="comment">/** <br /> * @param integer $country Country name <br /> * @param integer $vat_number VAT number to test e.g. GB123 4567 89 <br /> * @return integer -1 if country not included OR 1 if the VAT Num matches for the country OR 0 if no match <br />*/ <br /></span><span class="keyword">function </span><span class="default">checkVatNumber</span><span class="keyword">( </span><span class="default">$country</span><span class="keyword">, </span><span class="default">$vat_number </span><span class="keyword">) { <br /> switch(</span><span class="default">$country</span><span class="keyword">) { <br /> case </span><span class="string">'Austria'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(AT){0,1}U[0-9]{8}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Belgium'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(BE){0,1}[0]{0,1}[0-9]{9}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Bulgaria'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(BG){0,1}[0-9]{9,10}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Cyprus'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(CY){0,1}[0-9]{8}[A-Z]$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Czech Republic'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(CZ){0,1}[0-9]{8,10}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Denmark'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(DK){0,1}([0-9]{2}[\ ]{0,1}){3}[0-9]{2}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Estonia'</span><span class="keyword">: <br /> case </span><span class="string">'Germany'</span><span class="keyword">: <br /> case </span><span class="string">'Greece'</span><span class="keyword">: <br /> case </span><span class="string">'Portugal'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(EE|EL|DE|PT){0,1}[0-9]{9}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'France'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(FR){0,1}[0-9A-Z]{2}[\ ]{0,1}[0-9]{9}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Finland'</span><span class="keyword">: <br /> case </span><span class="string">'Hungary'</span><span class="keyword">: <br /> case </span><span class="string">'Luxembourg'</span><span class="keyword">: <br /> case </span><span class="string">'Malta'</span><span class="keyword">: <br /> case </span><span class="string">'Slovenia'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(FI|HU|LU|MT|SI){0,1}[0-9]{8}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Ireland'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(IE){0,1}[0-9][0-9A-Z\+\*][0-9]{5}[A-Z]$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Italy'</span><span class="keyword">: <br /> case </span><span class="string">'Latvia'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(IT|LV){0,1}[0-9]{11}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Lithuania'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(LT){0,1}([0-9]{9}|[0-9]{12})$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Netherlands'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(NL){0,1}[0-9]{9}B[0-9]{2}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Poland'</span><span class="keyword">: <br /> case </span><span class="string">'Slovakia'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(PL|SK){0,1}[0-9]{10}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Romania'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(RO){0,1}[0-9]{2,10}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Sweden'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(SE){0,1}[0-9]{12}$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'Spain'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(ES){0,1}([0-9A-Z][0-9]{7}[A-Z])|([A-Z][0-9]{7}[0-9A-Z])$/i'</span><span class="keyword">; <br /> break; <br /> case </span><span class="string">'United Kingdom'</span><span class="keyword">: <br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(GB){0,1}([1-9][0-9]{2}[\ ]{0,1}[0-9]{4}[\ ]{0,1}[0-9]{2})|([1-9][0-9]{2}[\ ]{0,1}[0-9]{4}[\ ]{0,1}[0-9]{2}[\ ]{0,1}[0-9]{3})|((GD|HA)[0-9]{3})$/i'</span><span class="keyword">; <br /> break; <br /> default: <br /> return -</span><span class="default">1</span><span class="keyword">; <br /> break; <br /> } <br /> <br /> return </span><span class="default">preg_match</span><span class="keyword">(</span><span class="default">$regex</span><span class="keyword">, </span><span class="default">$vat_number</span><span class="keyword">); <br />} <br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="112446"> <div class="votes"> <div id="Vu112446"> <a href="/manual/vote-note.php?id=112446&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd112446"> <a href="/manual/vote-note.php?id=112446&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V112446" title="57% like this..."> 5 </div> </div> <a href="#112446" class="name"> <strong class="user"><em>andre at koethur dot de</em></strong></a><a class="genanchor" href="#112446"> ¶</a><div class="date" title="2013-06-17 08:49"><strong>11 years ago</strong></div> <div class="text" id="Hcom112446"> <div class="phpcode"><code><span class="html">Be aware of bug <a href="https://bugs.php.net/bug.php?id=50887" rel="nofollow" target="_blank">https://bugs.php.net/bug.php?id=50887</a> when using sub patterns: Un-matched optional sub patterns at the end won't show up in $matches.<br /><br />Here is a workaround: Assign a name to all subpatterns you are interested in, and merge $match afterwards with an constant array containing some reasonable default values:<br /><br /><span class="default"><?php<br /></span><span class="keyword">if (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'/^(?P<lang>[^;*][^;]*){1}(?:;q=(?P<qval>[0-9.]+))?$/u'</span><span class="keyword">, </span><span class="string">'de'</span><span class="keyword">, </span><span class="default">$match</span><span class="keyword">))<br />{<br /> </span><span class="default">$match </span><span class="keyword">= </span><span class="default">array_merge</span><span class="keyword">(array(</span><span class="string">'lang' </span><span class="keyword">=> </span><span class="string">''</span><span class="keyword">, </span><span class="string">'qval' </span><span class="keyword">=> </span><span class="string">''</span><span class="keyword">), </span><span class="default">$match</span><span class="keyword">);<br /> </span><span class="default">print_r</span><span class="keyword">(</span><span class="default">$match</span><span class="keyword">);<br />}<br /></span><span class="default">?><br /></span><br />This outputs:<br />Array<br />(<br /> [lang] => de<br /> [qval] => <br /> [0] => de<br /> [1] => de<br />)<br /><br />Instead of:<br />Array<br />(<br /> [0] => de<br /> [lang] => de<br /> [1] => de<br />)</span></code></div> </div> </div> <div class="note" id="120033"> <div class="votes"> <div id="Vu120033"> <a href="/manual/vote-note.php?id=120033&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd120033"> <a href="/manual/vote-note.php?id=120033&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V120033" title="56% like this..."> 7 </div> </div> <a href="#120033" class="name"> <strong class="user"><em>solixmexico at outlook dot com</em></strong></a><a class="genanchor" href="#120033"> ¶</a><div class="date" title="2016-10-12 11:09"><strong>8 years ago</strong></div> <div class="text" id="Hcom120033"> <div class="phpcode"><code><span class="html">To validate directorys on Windows i used this:<br /><br />if( preg_match("#^([a-z]{1}\:{1})?[\\\/]?([\-\w]+[\\\/]?)*$#i",$_GET['path'],$matches) !== 1 ){<br /> echo("Invalid value");<br />}else{<br /> echo("Valid value");<br />}<br /><br />The parts are:<br /><br />#^ and $i Make the string matches at all the pattern, from start to end for ensure a complete match.<br />([a-z]{1}\:{1})? The string may starts with one letter and a colon, but only 1 character for eachone, this is for the drive letter (C:)<br />[\\\/]? The string may contain, but not require 1 slash or backslash after the drive letter, (\/)<br />([\-\w]+[\\\/]?)* The string must have 1 or more of any character like hyphen, letter, number, underscore, and may contain a slash or back slash at the end, to have a directory like ("/" or "folderName" or "folderName/"), this may be repeated one or more times.</span></code></div> </div> </div> <div class="note" id="107958"> <div class="votes"> <div id="Vu107958"> <a href="/manual/vote-note.php?id=107958&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd107958"> <a href="/manual/vote-note.php?id=107958&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V107958" title="57% like this..."> 3 </div> </div> <a href="#107958" class="name"> <strong class="user"><em>aer0s</em></strong></a><a class="genanchor" href="#107958"> ¶</a><div class="date" title="2012-03-16 09:15"><strong>13 years ago</strong></div> <div class="text" id="Hcom107958"> <div class="phpcode"><code><span class="html">Simple function to return a sub-string following the preg convention. Kind of expensive, and some might say lazy but it has saved me time.<br /><br /># preg_substr($pattern,$subject,[$offset]) function<br /># @author aer0s<br /># return a specific sub-string in a string using <br /># a regular expression <br /># @param $pattern regular expression pattern to match<br /># @param $subject string to search<br /># @param [$offset] zero based match occurrence to return<br /># <br /># [$offset] is 0 by default which returns the first occurrence,<br /># if [$offset] is -1 it will return the last occurrence <br /><br />function preg_substr($pattern,$subject,$offset=0){<br /> preg_match_all($pattern,$subject,$matches,PREG_PATTERN_ORDER);<br /> return $offset==-1?array_pop($matches[0]):$matches[0][$offset];<br />} <br /><br />example: <br /><br /> $pattern = "/model(\s|-)[a-z0-9]/i";<br /> $subject = "Is there something wrong with model 654, Model 732, and model 43xl or is Model aj45B the preferred choice?";<br /><br /> echo preg_substr($pattern,$subject);<br /> echo preg_substr($pattern,$subject,1);<br /> echo preg_substr($pattern,$subject,-1); <br /><br />Returns something like:<br /><br /> model 654<br /> Model 732<br /> Model aj45B</span></code></div> </div> </div> <div class="note" id="124691"> <div class="votes"> <div id="Vu124691"> <a href="/manual/vote-note.php?id=124691&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd124691"> <a href="/manual/vote-note.php?id=124691&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V124691" title="55% like this..."> 1 </div> </div> <a href="#124691" class="name"> <strong class="user"><em>ASchmidt at Anamera dot net</em></strong></a><a class="genanchor" href="#124691"> ¶</a><div class="date" title="2020-02-06 05:58"><strong>5 years ago</strong></div> <div class="text" id="Hcom124691"> <div class="phpcode"><code><span class="html">After the breaking change in 7.4, be aware that count( $matches ) may be different, depending on PREG_UNMATCHED_AS_NULL flag. <br /><br />With PREG_UNMATCHED_AS_NULL, count( $matches ) will always be the maximum number of subpatterns. <br />However, without PREG_UNMATCHED_AS_NULL the $matches array will omit any unmatched subpatterns at the tail end.<br /><br />Result forthe first two out of three matches with PREG_OFFSET_CAPTURE flag only:<br /><br />array (size=3)<br /> 0 => <br /> array (size=2)<br /> 0 => string 'may/02' (length=6)<br /> 1 => int 0<br /> 1 => <br /> array (size=2)<br /> 0 => string 'may' (length=3)<br /> 1 => int 0<br /> 2 => <br /> array (size=2)<br /> 0 => string '02' (length=2)<br /> 1 => int 4<br /><br />Result for two out of three matches with additional PREG_UNMATCHED_AS_NULL flags:<br /><br />array (size=4)<br /> 0 => <br /> array (size=2)<br /> 0 => string 'may/02' (length=6)<br /> 1 => int 0<br /> 1 => <br /> array (size=2)<br /> 0 => string 'may' (length=3)<br /> 1 => int 0<br /> 2 => <br /> array (size=2)<br /> 0 => string '02' (length=2)<br /> 1 => int 4<br /> 3 => <br /> array (size=2)<br /> 0 => null<br /> 1 => int -1</span></code></div> </div> </div> <div class="note" id="98310"> <div class="votes"> <div id="Vu98310"> <a href="/manual/vote-note.php?id=98310&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd98310"> <a href="/manual/vote-note.php?id=98310&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V98310" title="57% like this..."> 4 </div> </div> <a href="#98310" class="name"> <strong class="user"><em>SoN9ne at gmail dot com</em></strong></a><a class="genanchor" href="#98310"> ¶</a><div class="date" title="2010-06-08 10:10"><strong>14 years ago</strong></div> <div class="text" id="Hcom98310"> <div class="phpcode"><code><span class="html">I have been working on a email system that will automatically generate a text email from a given HTML email by using strip_tags(). <br />The only issue I ran into, for my needs, were that the anchors would not keep their links. <br />I search for a little while and could not find anything to strip the links from the tags so I generated my own little snippet. <br />I am posting it here in hopes that others may find it useful and for later reference.<br /><br />A note to keep in mind:<br />I was primarily concerned with valid HTML so if attributes do no use ' or " to contain the values then this will need to be tweaked.<br />If you can edit this to work better, please let me know.<br /><span class="default"><?php<br /></span><span class="comment">/**<br /> * Replaces anchor tags with text<br /> * - Will search string and replace all anchor tags with text (case insensitive)<br /> * <br /> * How it works:<br /> * - Searches string for an anchor tag, checks to make sure it matches the criteria<br /> * Anchor search criteria:<br /> * - 1 - <a (must have the start of the anchor tag )<br /> * - 2 - Can have any number of spaces or other attributes before and after the href attribute<br /> * - 3 - Must close the anchor tag<br /> * <br /> * - Once the check has passed it will then replace the anchor tag with the string replacement<br /> * - The string replacement can be customized<br /> * <br /> * Know issue:<br /> * - This will not work for anchors that do not use a ' or " to contain the attributes. <br /> * (i.e.- <a href=http: //php.net>PHP.net</a> will not be replaced)<br /> */<br /></span><span class="keyword">function </span><span class="default">replaceAnchorsWithText</span><span class="keyword">(</span><span class="default">$data</span><span class="keyword">) {<br /> </span><span class="comment">/**<br /> * Had to modify $regex so it could post to the site... so I broke it into 6 parts.<br /> */<br /> </span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/(<a\s*'</span><span class="keyword">; </span><span class="comment">// Start of anchor tag<br /> </span><span class="default">$regex </span><span class="keyword">.= </span><span class="string">'(.*?)\s*'</span><span class="keyword">; </span><span class="comment">// Any attributes or spaces that may or may not exist<br /> </span><span class="default">$regex </span><span class="keyword">.= </span><span class="string">'href=[\'"]+?\s*(?P<link>\S+)\s*[\'"]+?'</span><span class="keyword">; </span><span class="comment">// Grab the link<br /> </span><span class="default">$regex </span><span class="keyword">.= </span><span class="string">'\s*(.*?)\s*>\s*'</span><span class="keyword">; </span><span class="comment">// Any attributes or spaces that may or may not exist before closing tag <br /> </span><span class="default">$regex </span><span class="keyword">.= </span><span class="string">'(?P<name>\S+)'</span><span class="keyword">; </span><span class="comment">// Grab the name<br /> </span><span class="default">$regex </span><span class="keyword">.= </span><span class="string">'\s*<\/a>)/i'</span><span class="keyword">; </span><span class="comment">// Any number of spaces between the closing anchor tag (case insensitive)<br /> <br /> </span><span class="keyword">if (</span><span class="default">is_array</span><span class="keyword">(</span><span class="default">$data</span><span class="keyword">)) {<br /> </span><span class="comment">// This is what will replace the link (modify to you liking)<br /> </span><span class="default">$data </span><span class="keyword">= </span><span class="string">"</span><span class="keyword">{</span><span class="default">$data</span><span class="keyword">[</span><span class="string">'name'</span><span class="keyword">]}</span><span class="string">(</span><span class="keyword">{</span><span class="default">$data</span><span class="keyword">[</span><span class="string">'link'</span><span class="keyword">]}</span><span class="string">)"</span><span class="keyword">;<br /> }<br /> return </span><span class="default">preg_replace_callback</span><span class="keyword">(</span><span class="default">$regex</span><span class="keyword">, </span><span class="string">'replaceAnchorsWithText'</span><span class="keyword">, </span><span class="default">$data</span><span class="keyword">);<br />}<br /><br /></span><span class="default">$input </span><span class="keyword">= </span><span class="string">'Test 1: <a href="http: //php.net1">PHP.NET1</a>.<br />'</span><span class="keyword">;<br /></span><span class="default">$input </span><span class="keyword">.= </span><span class="string">'Test 2: <A name="test" HREF=\'HTTP: //PHP.NET2\' target="_blank">PHP.NET2</A>.<BR />'</span><span class="keyword">;<br /></span><span class="default">$input </span><span class="keyword">.= </span><span class="string">'Test 3: <a hRef=http: //php.net3>php.net3</a><br />'</span><span class="keyword">;<br /></span><span class="default">$input </span><span class="keyword">.= </span><span class="string">'This last line had nothing to do with any of this'</span><span class="keyword">;<br /><br />echo </span><span class="default">replaceAnchorsWithText</span><span class="keyword">(</span><span class="default">$input</span><span class="keyword">).</span><span class="string">'<hr/>'</span><span class="keyword">;<br /></span><span class="default">?><br /></span>Will output:<br />Test 1: PHP.NET1(http: //php.net1).<br />Test 2: PHP.NET2(HTTP: //PHP.NET2).<br />Test 3: php.net3 (is still an anchor)<br />This last line had nothing to do with any of this<br /><br />Posting to this site is painful...<br />Had to break up the regex and had to break the test links since it was being flagged as spam...</span></code></div> </div> </div> <div class="note" id="90503"> <div class="votes"> <div id="Vu90503"> <a href="/manual/vote-note.php?id=90503&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd90503"> <a href="/manual/vote-note.php?id=90503&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V90503" title="56% like this..."> 9 </div> </div> <a href="#90503" class="name"> <strong class="user"><em>corey [works at] effim [delete] .com</em></strong></a><a class="genanchor" href="#90503"> ¶</a><div class="date" title="2009-04-24 08:52"><strong>15 years ago</strong></div> <div class="text" id="Hcom90503"> <div class="phpcode"><code><span class="html">I see a lot of people trying to put together phone regex's and struggling (hey, no worries...they're complicated). Here's one that we use that's pretty nifty. It's not perfect, but it should work for most non-idealists. <br /> <br />*** Note: Only matches U.S. phone numbers. *** <br /> <br /><span class="default"><?php <br /> <br /></span><span class="comment">// all on one line... <br /></span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(?:1(?:[. -])?)?(?:\((?=\d{3}\)))?([2-9]\d{2})(?:(?<=\(\d{3})\))? ?(?:(?<=\d{3})[.-])?([2-9]\d{2})[. -]?(\d{4})(?: (?i:ext)\.? ?(\d{1,5}))?$/'</span><span class="keyword">; <br /> <br /></span><span class="comment">// or broken up <br /></span><span class="default">$regex </span><span class="keyword">= </span><span class="string">'/^(?:1(?:[. -])?)?(?:\((?=\d{3}\)))?([2-9]\d{2})' <br /> </span><span class="keyword">.</span><span class="string">'(?:(?<=\(\d{3})\))? ?(?:(?<=\d{3})[.-])?([2-9]\d{2})' <br /> </span><span class="keyword">.</span><span class="string">'[. -]?(\d{4})(?: (?i:ext)\.? ?(\d{1,5}))?$/'</span><span class="keyword">; <br /> <br /></span><span class="default">?> <br /></span> <br />If you're wondering why all the non-capturing subpatterns (which look like this "(?:", it's so that we can do this: <br /> <br /><span class="default"><?php <br /> <br />$formatted </span><span class="keyword">= </span><span class="default">preg_replace</span><span class="keyword">(</span><span class="default">$regex</span><span class="keyword">, </span><span class="string">'($1) $2-$3 ext. $4'</span><span class="keyword">, </span><span class="default">$phoneNumber</span><span class="keyword">); <br /> <br /></span><span class="comment">// or, provided you use the $matches argument in preg_match <br /> <br /></span><span class="default">$formatted </span><span class="keyword">= </span><span class="string">"(</span><span class="default">$matches</span><span class="keyword">[</span><span class="default">1</span><span class="keyword">]</span><span class="string">) </span><span class="default">$matches</span><span class="keyword">[</span><span class="default">2</span><span class="keyword">]</span><span class="string">-</span><span class="default">$matches</span><span class="keyword">[</span><span class="default">3</span><span class="keyword">]</span><span class="string">"</span><span class="keyword">; <br />if (</span><span class="default">$matches</span><span class="keyword">[</span><span class="default">4</span><span class="keyword">]) </span><span class="default">$formatted </span><span class="keyword">.= </span><span class="string">" </span><span class="default">$matches</span><span class="keyword">[</span><span class="default">4</span><span class="keyword">]</span><span class="string">"</span><span class="keyword">; <br /> <br /></span><span class="default">?> <br /></span> <br />*** Results: *** <br />520-555-5542 :: MATCH <br />520.555.5542 :: MATCH <br />5205555542 :: MATCH <br />520 555 5542 :: MATCH <br />520) 555-5542 :: FAIL <br />(520 555-5542 :: FAIL <br />(520)555-5542 :: MATCH <br />(520) 555-5542 :: MATCH <br />(520) 555 5542 :: MATCH <br />520-555.5542 :: MATCH <br />520 555-0555 :: MATCH <br />(520)5555542 :: MATCH <br />520.555-4523 :: MATCH <br />19991114444 :: FAIL <br />19995554444 :: MATCH <br />514 555 1231 :: MATCH <br />1 555 555 5555 :: MATCH <br />1.555.555.5555 :: MATCH <br />1-555-555-5555 :: MATCH <br />520-555-5542 ext.123 :: MATCH <br />520.555.5542 EXT 123 :: MATCH <br />5205555542 Ext. 7712 :: MATCH <br />520 555 5542 ext 5 :: MATCH <br />520) 555-5542 :: FAIL <br />(520 555-5542 :: FAIL <br />(520)555-5542 ext .4 :: FAIL <br />(512) 555-1234 ext. 123 :: MATCH <br />1(555)555-5555 :: MATCH</span></code></div> </div> </div> <div class="note" id="121346"> <div class="votes"> <div id="Vu121346"> <a href="/manual/vote-note.php?id=121346&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd121346"> <a href="/manual/vote-note.php?id=121346&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V121346" title="55% like this..."> 2 </div> </div> <a href="#121346" class="name"> <strong class="user"><em>geompse at gmail dot com</em></strong></a><a class="genanchor" href="#121346"> ¶</a><div class="date" title="2017-07-10 10:13"><strong>7 years ago</strong></div> <div class="text" id="Hcom121346"> <div class="phpcode"><code><span class="html">The function will return false and raise a warning if the input $subject is too long :<br />[PhpWarning] preg_match(): Subject is too long<br /><br />I believe the limit is 1 or 2 GB because I was using a 2.2GB string.<br />While a parameter might exist to alter this limit, in my case it was possible and wiser to use <500MB strings instead.</span></code></div> </div> </div> <div class="note" id="105598"> <div class="votes"> <div id="Vu105598"> <a href="/manual/vote-note.php?id=105598&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd105598"> <a href="/manual/vote-note.php?id=105598&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V105598" title="55% like this..."> 2 </div> </div> <a href="#105598" class="name"> <strong class="user"><em>cmallabon at homesfactory dot com</em></strong></a><a class="genanchor" href="#105598"> ¶</a><div class="date" title="2011-08-30 10:28"><strong>13 years ago</strong></div> <div class="text" id="Hcom105598"> <div class="phpcode"><code><span class="html">Just an interesting note. Was just updating code to replace ereg() with strpos() and preg_match and the thought occured that preg_match() could be optimized to quit early when only searching if a string begins with something, for example<br /><span class="default"><?php<br /></span><span class="keyword">if(</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"/^http/"</span><span class="keyword">, </span><span class="default">$url</span><span class="keyword">))<br />{<br /> </span><span class="comment">//do something<br /></span><span class="keyword">}<br /></span><span class="default">?><br /></span><br /> vs <br /><br /><span class="default"><?php <br /></span><span class="keyword">if(</span><span class="default">strpos</span><span class="keyword">(</span><span class="default">$url</span><span class="keyword">, </span><span class="string">"http"</span><span class="keyword">) === </span><span class="default">0</span><span class="keyword">)<br />{<br /></span><span class="comment">//do something<br /></span><span class="keyword">}<br /></span><span class="default">?><br /></span><br />As I guessed, strpos() is always faster (about 2x) for short strings like a URL but for very long strings of several paragraphs (e.g. a block of XML) when the string doesn't start with the needle preg_match as twice as fast as strpos() as it doesn't scan the entire string.<br /><br />So, if you are searching long strings and expect it to normally be true (e.g. validating XML), strpos() is a much faster BUT if you expect if to often fail, preg_match is the better choice.</span></code></div> </div> </div> <div class="note" id="102088"> <div class="votes"> <div id="Vu102088"> <a href="/manual/vote-note.php?id=102088&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd102088"> <a href="/manual/vote-note.php?id=102088&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V102088" title="55% like this..."> 2 </div> </div> <a href="#102088" class="name"> <strong class="user"><em>Frank</em></strong></a><a class="genanchor" href="#102088"> ¶</a><div class="date" title="2011-01-26 12:12"><strong>14 years ago</strong></div> <div class="text" id="Hcom102088"> <div class="phpcode"><code><span class="html">If someone is from a country that accepts decimal numbers in format 9.00 and 9,00 (point or comma), number validation would be like that:<br /><span class="default"><?php<br />$number_check </span><span class="keyword">= </span><span class="string">"9,99"</span><span class="keyword">;<br />if (</span><span class="default">preg_match</span><span class="keyword">( </span><span class="string">'/^[\-+]?[0-9]*\.*\,?[0-9]+$/'</span><span class="keyword">, </span><span class="default">$number_check</span><span class="keyword">)) {<br /> return </span><span class="default">TRUE</span><span class="keyword">; <br />}<br /></span><span class="default">?><br /></span><br />However, if the number will be written in the database, most probably this comma needs to be replaced with a dot. <br />This can be done with use of str_replace, i.e :<br /><span class="default"><?php<br />$number_database </span><span class="keyword">= </span><span class="default">str_replace</span><span class="keyword">(</span><span class="string">"," </span><span class="keyword">, </span><span class="string">"." </span><span class="keyword">, </span><span class="default">$number_check</span><span class="keyword">);<br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="97242"> <div class="votes"> <div id="Vu97242"> <a href="/manual/vote-note.php?id=97242&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd97242"> <a href="/manual/vote-note.php?id=97242&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V97242" title="55% like this..."> 2 </div> </div> <a href="#97242" class="name"> <strong class="user"><em>teracci2002</em></strong></a><a class="genanchor" href="#97242"> ¶</a><div class="date" title="2010-04-09 09:00"><strong>14 years ago</strong></div> <div class="text" id="Hcom97242"> <div class="phpcode"><code><span class="html">When you use preg_match() for security purpose or huge data processing,<br />mayby you should make consideration for backtrack_limit and recursion_limit.<br /><a href="http://www.php.net/manual/en/pcre.configuration.php" rel="nofollow" target="_blank">http://www.php.net/manual/en/pcre.configuration.php</a><br /><br />These limits may bring wrong matching result.<br />You can verify whether you hit these limits by checking preg_last_error().<br /><a href="http://www.php.net/manual/en/function.preg-last-error.php" rel="nofollow" target="_blank">http://www.php.net/manual/en/function.preg-last-error.php</a></span></code></div> </div> </div> <div class="note" id="94678"> <div class="votes"> <div id="Vu94678"> <a href="/manual/vote-note.php?id=94678&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd94678"> <a href="/manual/vote-note.php?id=94678&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V94678" title="54% like this..."> 1 </div> </div> <a href="#94678" class="name"> <strong class="user"><em>Stefan</em></strong></a><a class="genanchor" href="#94678"> ¶</a><div class="date" title="2009-11-17 02:47"><strong>15 years ago</strong></div> <div class="text" id="Hcom94678"> <div class="phpcode"><code><span class="html">I spent a while replacing all my ereg() calls to preg_match(), since ereg() is now deprecated and will not be supported as of v 6.0. <br /> <br />Just a warning regarding the conversion, the two functions behave very similarly, but not exactly alike. Obviously, you will need to delimit your pattern with '/' or '|' characters. <br /> <br />The difference that stumped me was that preg_replace overwrites the $matches array regardless if a match was found. If no match was found, $matches is simply empty. <br /> <br />ereg(), however, would leave $matches alone if a match was not found. In my code, I had repeated calls to ereg, and was populating $matches with each match. I was only interested in the last match. However, with preg_match, if the very last call to the function did not result in a match, the $matches array would be overwritten with a blank value. <br /> <br />Here is an example code snippet to illustrate: <br /> <br /><span class="default"><?php <br />$test </span><span class="keyword">= array(</span><span class="string">'yes'</span><span class="keyword">,</span><span class="string">'no'</span><span class="keyword">,</span><span class="string">'yes'</span><span class="keyword">,</span><span class="string">'no'</span><span class="keyword">,</span><span class="string">'yes'</span><span class="keyword">,</span><span class="string">'no'</span><span class="keyword">); <br /> <br />foreach (</span><span class="default">$test </span><span class="keyword">as </span><span class="default">$key</span><span class="keyword">=></span><span class="default">$value</span><span class="keyword">) { <br /> </span><span class="default">ereg</span><span class="keyword">(</span><span class="string">"yes"</span><span class="keyword">,</span><span class="default">$value</span><span class="keyword">,</span><span class="default">$matches1</span><span class="keyword">); <br /> </span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"|yes|"</span><span class="keyword">,</span><span class="default">$value</span><span class="keyword">,</span><span class="default">$matches2</span><span class="keyword">); <br />} <br /> print </span><span class="string">"ereg result: </span><span class="default">$matches1</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">]</span><span class="string"><br>"</span><span class="keyword">; <br /> print </span><span class="string">"preg_match result: </span><span class="default">$matches2</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">]</span><span class="string"><br>"</span><span class="keyword">; <br /></span><span class="default">?> <br /></span> <br />The output is: <br />ereg result: yes <br />preg_match result: <br /> <br />($matches2[0] in this case is empty) <br /> <br />I believe the preg_match behavior is cleaner. I just thought I would report this to hopefully save others some time.</span></code></div> </div> </div> <div class="note" id="90771"> <div class="votes"> <div id="Vu90771"> <a href="/manual/vote-note.php?id=90771&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd90771"> <a href="/manual/vote-note.php?id=90771&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V90771" title="54% like this..."> 2 </div> </div> <a href="#90771" class="name"> <strong class="user"><em>matt</em></strong></a><a class="genanchor" href="#90771"> ¶</a><div class="date" title="2009-05-08 01:07"><strong>15 years ago</strong></div> <div class="text" id="Hcom90771"> <div class="phpcode"><code><span class="html">To support large Unicode ranges (ie: [\x{E000}-\x{FFFD}] or \x{10FFFFF}) you must use the modifier '/u' at the end of your expression.</span></code></div> </div> </div> <div class="note" id="89252"> <div class="votes"> <div id="Vu89252"> <a href="/manual/vote-note.php?id=89252&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd89252"> <a href="/manual/vote-note.php?id=89252&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V89252" title="54% like this..."> 2 </div> </div> <a href="#89252" class="name"> <strong class="user"><em>wjaspers4 [at] gmail [dot] com</em></strong></a><a class="genanchor" href="#89252"> ¶</a><div class="date" title="2009-02-27 03:16"><strong>16 years ago</strong></div> <div class="text" id="Hcom89252"> <div class="phpcode"><code><span class="html">I recently encountered a problem trying to capture multiple instances of named subpatterns from filenames.<br />Therefore, I came up with this function.<br /><br />The function allows you to pass through flags (in this version it applies to all expressions tested), and generates an array of search results.<br /><br />Enjoy!<br /><br /><span class="default"><?php<br /><br /></span><span class="comment">/**<br /> * Allows multiple expressions to be tested on one string.<br /> * This will return a boolean, however you may want to alter this.<br /> *<br /> * @author William Jaspers, IV <wjaspers4@gmail.com><br /> * @created 2009-02-27 17:00:00 +6:00:00 GMT<br /> * @access public<br /> *<br /> * @param array $patterns An array of expressions to be tested.<br /> * @param String $subject The data to test.<br /> * @param array $findings Optional argument to store our results.<br /> * @param mixed $flags Pass-thru argument to allow normal flags to apply to all tested expressions.<br /> * @param array $errors A storage bin for errors<br /> *<br /> * @returns bool Whether or not errors occurred.<br /> */<br /></span><span class="keyword">function </span><span class="default">preg_match_multiple</span><span class="keyword">( <br /> array </span><span class="default">$patterns</span><span class="keyword">=array(), <br /> </span><span class="default">$subject</span><span class="keyword">=</span><span class="default">null</span><span class="keyword">,<br /> &</span><span class="default">$findings</span><span class="keyword">=array(),<br /> </span><span class="default">$flags</span><span class="keyword">=</span><span class="default">false</span><span class="keyword">,<br /> &</span><span class="default">$errors</span><span class="keyword">=array()<br />) {<br /> foreach( </span><span class="default">$patterns </span><span class="keyword">as </span><span class="default">$name </span><span class="keyword">=> </span><span class="default">$pattern </span><span class="keyword">)<br /> {<br /> if( </span><span class="default">1 </span><span class="keyword"><= </span><span class="default">preg_match_all</span><span class="keyword">( </span><span class="default">$pattern</span><span class="keyword">, </span><span class="default">$subject</span><span class="keyword">, </span><span class="default">$found</span><span class="keyword">, </span><span class="default">$flags </span><span class="keyword">) )<br /> {<br /> </span><span class="default">$findings</span><span class="keyword">[</span><span class="default">$name</span><span class="keyword">] = </span><span class="default">$found</span><span class="keyword">;<br /> } else <br /> {<br /> if( </span><span class="default">PREG_NO_ERROR </span><span class="keyword">!== ( </span><span class="default">$code </span><span class="keyword">= </span><span class="default">preg_last_error</span><span class="keyword">() ))<br /> {<br /> </span><span class="default">$errors</span><span class="keyword">[</span><span class="default">$name</span><span class="keyword">] = </span><span class="default">$code</span><span class="keyword">;<br /> } else </span><span class="default">$findings</span><span class="keyword">[</span><span class="default">$name</span><span class="keyword">] = array();<br /> }<br /> }<br /> return (</span><span class="default">0</span><span class="keyword">===</span><span class="default">sizeof</span><span class="keyword">(</span><span class="default">$errors</span><span class="keyword">));<br />}<br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="129704"> <div class="votes"> <div id="Vu129704"> <a href="/manual/vote-note.php?id=129704&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd129704"> <a href="/manual/vote-note.php?id=129704&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V129704" title="no votes..."> 0 </div> </div> <a href="#129704" class="name"> <strong class="user"><em>turabgarip at gmail dot com</em></strong></a><a class="genanchor" href="#129704"> ¶</a><div class="date" title="2024-08-13 01:07"><strong>7 months ago</strong></div> <div class="text" id="Hcom129704"> <div class="phpcode"><code><span class="html">Worth to note that you might experience different results in regex functions when your string includes literal tab characters or the tab character notation.<br /><br />As you know, tab character matches with \s since it's a whitespace. But what if we use a numeric quantifier? Like \s{2,}<br /><br />This should match two or more subsequent whitespace characters, including two tabs (or one tab and one space), but not one tab only. But you might experience at some places your literal tab character matching with this quantifier. This is because some editors silently convert tab characters to 2 or 4 spaces according to your auto-indentation settings. This makes it eligible for \s{2,} since it's not a tab character anymore. But if you have the tab character notation (\t) instead of the literal tab string, this will never happen and thus it won't match this regex.</span></code></div> </div> </div> <div class="note" id="110144"> <div class="votes"> <div id="Vu110144"> <a href="/manual/vote-note.php?id=110144&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd110144"> <a href="/manual/vote-note.php?id=110144&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V110144" title="52% like this..."> 1 </div> </div> <a href="#110144" class="name"> <strong class="user"><em>Anonymous</em></strong></a><a class="genanchor" href="#110144"> ¶</a><div class="date" title="2012-09-24 08:02"><strong>12 years ago</strong></div> <div class="text" id="Hcom110144"> <div class="phpcode"><code><span class="html">Here is a function that decreases the numbers inside a string (useful to convert DOM object into simplexml object)<br /><br />e.g.: decremente_chaine("somenode->anode[2]->achildnode[3]") will return "somenode->anode[1]->achildnode[2]"<br /><br />the numbering of the nodes in simplexml starts from zero, but from 1 in DOM xpath objects<br /><br /><span class="default"><?php<br /></span><span class="keyword">function </span><span class="default">decremente_chaine</span><span class="keyword">(</span><span class="default">$chaine</span><span class="keyword">)<br /> {<br /> </span><span class="comment">//récupérer toutes les occurrences de nombres et leurs indices<br /> </span><span class="default">preg_match_all</span><span class="keyword">(</span><span class="string">"/[0-9]+/"</span><span class="keyword">,</span><span class="default">$chaine</span><span class="keyword">,</span><span class="default">$out</span><span class="keyword">,</span><span class="default">PREG_OFFSET_CAPTURE</span><span class="keyword">);<br /> </span><span class="comment">//parcourir les occurrences <br /> </span><span class="keyword">for(</span><span class="default">$i</span><span class="keyword">=</span><span class="default">0</span><span class="keyword">;</span><span class="default">$i</span><span class="keyword"><</span><span class="default">sizeof</span><span class="keyword">(</span><span class="default">$out</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">]);</span><span class="default">$i</span><span class="keyword">++)<br /> {<br /> </span><span class="default">$longueurnombre </span><span class="keyword">= </span><span class="default">strlen</span><span class="keyword">((string)</span><span class="default">$out</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">][</span><span class="default">$i</span><span class="keyword">][</span><span class="default">0</span><span class="keyword">]);<br /> </span><span class="default">$taillechaine </span><span class="keyword">= </span><span class="default">strlen</span><span class="keyword">(</span><span class="default">$chaine</span><span class="keyword">);<br /> </span><span class="comment">// découper la chaine en 3 morceaux<br /> </span><span class="default">$debut </span><span class="keyword">= </span><span class="default">substr</span><span class="keyword">(</span><span class="default">$chaine</span><span class="keyword">,</span><span class="default">0</span><span class="keyword">,</span><span class="default">$out</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">][</span><span class="default">$i</span><span class="keyword">][</span><span class="default">1</span><span class="keyword">]);<br /> </span><span class="default">$milieu </span><span class="keyword">= (</span><span class="default">$out</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">][</span><span class="default">$i</span><span class="keyword">][</span><span class="default">0</span><span class="keyword">])-</span><span class="default">1</span><span class="keyword">;<br /> </span><span class="default">$fin </span><span class="keyword">= </span><span class="default">substr</span><span class="keyword">(</span><span class="default">$chaine</span><span class="keyword">,</span><span class="default">$out</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">][</span><span class="default">$i</span><span class="keyword">][</span><span class="default">1</span><span class="keyword">]+</span><span class="default">$longueurnombre</span><span class="keyword">,</span><span class="default">$taillechaine</span><span class="keyword">);<br /> </span><span class="comment">// si c'est 10,100,1000 etc. on décale tout de 1 car le résultat comporte un chiffre de moins<br /> </span><span class="keyword">if(</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">'#[1][0]+$#'</span><span class="keyword">, </span><span class="default">$out</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">][</span><span class="default">$i</span><span class="keyword">][</span><span class="default">0</span><span class="keyword">]))<br /> {<br /> for(</span><span class="default">$j </span><span class="keyword">= </span><span class="default">$i</span><span class="keyword">+</span><span class="default">1</span><span class="keyword">;</span><span class="default">$j</span><span class="keyword"><</span><span class="default">sizeof</span><span class="keyword">(</span><span class="default">$out</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">]);</span><span class="default">$j</span><span class="keyword">++)<br /> {<br /> </span><span class="default">$out</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">][</span><span class="default">$j</span><span class="keyword">][</span><span class="default">1</span><span class="keyword">] = </span><span class="default">$out</span><span class="keyword">[</span><span class="default">0</span><span class="keyword">][</span><span class="default">$j</span><span class="keyword">][</span><span class="default">1</span><span class="keyword">] -</span><span class="default">1</span><span class="keyword">;<br /> }<br /> }<br /> </span><span class="default">$chaine </span><span class="keyword">= </span><span class="default">$debut</span><span class="keyword">.</span><span class="default">$milieu</span><span class="keyword">.</span><span class="default">$fin</span><span class="keyword">;<br /> }<br /> return </span><span class="default">$chaine</span><span class="keyword">;<br /> }<br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="105594"> <div class="votes"> <div id="Vu105594"> <a href="/manual/vote-note.php?id=105594&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd105594"> <a href="/manual/vote-note.php?id=105594&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V105594" title="52% like this..."> 1 </div> </div> <a href="#105594" class="name"> <strong class="user"><em>ayman2243 at gmail dot com</em></strong></a><a class="genanchor" href="#105594"> ¶</a><div class="date" title="2011-08-30 04:55"><strong>13 years ago</strong></div> <div class="text" id="Hcom105594"> <div class="phpcode"><code><span class="html">highlight Search Words <br /> <br /><span class="default"><?php <br /></span><span class="keyword">function </span><span class="default">highlight</span><span class="keyword">(</span><span class="default">$word</span><span class="keyword">, </span><span class="default">$subject</span><span class="keyword">) { <br /> <br /> </span><span class="default">$split_subject </span><span class="keyword">= </span><span class="default">explode</span><span class="keyword">(</span><span class="string">" "</span><span class="keyword">, </span><span class="default">$subject</span><span class="keyword">); <br /> </span><span class="default">$split_word </span><span class="keyword">= </span><span class="default">explode</span><span class="keyword">(</span><span class="string">" "</span><span class="keyword">, </span><span class="default">$word</span><span class="keyword">); <br /> <br /> foreach (</span><span class="default">$split_subject </span><span class="keyword">as </span><span class="default">$k </span><span class="keyword">=> </span><span class="default">$v</span><span class="keyword">){ <br /> foreach (</span><span class="default">$split_word </span><span class="keyword">as </span><span class="default">$k2 </span><span class="keyword">=> </span><span class="default">$v2</span><span class="keyword">){ <br /> if(</span><span class="default">$v2 </span><span class="keyword">== </span><span class="default">$v</span><span class="keyword">){ <br /> <br /> </span><span class="default">$split_subject</span><span class="keyword">[</span><span class="default">$k</span><span class="keyword">] = </span><span class="string">"<span class='highlight'>"</span><span class="keyword">.</span><span class="default">$v</span><span class="keyword">.</span><span class="string">"</span>"</span><span class="keyword">; <br /> <br /> } <br /> } <br /> } <br /> <br /> return </span><span class="default">implode</span><span class="keyword">(</span><span class="string">' '</span><span class="keyword">, </span><span class="default">$split_subject</span><span class="keyword">); <br />} <br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="125631"> <div class="votes"> <div id="Vu125631"> <a href="/manual/vote-note.php?id=125631&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd125631"> <a href="/manual/vote-note.php?id=125631&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V125631" title="no votes..."> 0 </div> </div> <a href="#125631" class="name"> <strong class="user"><em>chris at ocproducts dot com</em></strong></a><a class="genanchor" href="#125631"> ¶</a><div class="date" title="2020-12-28 03:43"><strong>4 years ago</strong></div> <div class="text" id="Hcom125631"> <div class="phpcode"><code><span class="html">If PREG_OFFSET_CAPTURE is set then unmatched captures (i.e. ones with '?') will not be present in the result array. This is presumably because there is no offset, and thus the original PHP dev decided best to just leave it out.</span></code></div> </div> </div> <div class="note" id="96339"> <div class="votes"> <div id="Vu96339"> <a href="/manual/vote-note.php?id=96339&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd96339"> <a href="/manual/vote-note.php?id=96339&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V96339" title="52% like this..."> 1 </div> </div> <a href="#96339" class="name"> <strong class="user"><em>plasma</em></strong></a><a class="genanchor" href="#96339"> ¶</a><div class="date" title="2010-02-21 04:53"><strong>15 years ago</strong></div> <div class="text" id="Hcom96339"> <div class="phpcode"><code><span class="html">To extract scheme, host, path, ect. simply use <br /> <br /><span class="default"><?php <br /> <br /> $url </span><span class="keyword">= </span><span class="string">'<a href="http://name:pass@" rel="nofollow" target="_blank">http://name:pass@</a>'</span><span class="keyword">; <br /> </span><span class="default">$url </span><span class="keyword">.= </span><span class="string">'example.com:10000'</span><span class="keyword">; <br /> </span><span class="default">$url </span><span class="keyword">.= </span><span class="string">'/path/to/file.php?a=1&amp;b=2#anchor'</span><span class="keyword">; <br /> <br /> </span><span class="default">$url_data </span><span class="keyword">= </span><span class="default">parse_url </span><span class="keyword">( </span><span class="default">$url </span><span class="keyword">); <br /> <br /> </span><span class="default">print_r </span><span class="keyword">( </span><span class="default">$url_data </span><span class="keyword">); <br /> <br /></span><span class="default">?> <br /></span>___ <br />prints out something like: <br /> <br />Array <br />( <br /> [scheme] => http <br /> [host] => wild.subdomain.orgy.domain.co.uk <br /> [port] => 10000 <br /> [user] => name <br /> [pass] => pass <br /> [path] => /path/to/file.php <br /> [query] => a=1&b=2 <br /> [fragment] => anchor <br />) <br /> <br />In my tests parse_url is up to 15x faster than preg_match(_all)!</span></code></div> </div> </div> <div class="note" id="124690"> <div class="votes"> <div id="Vu124690"> <a href="/manual/vote-note.php?id=124690&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd124690"> <a href="/manual/vote-note.php?id=124690&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V124690" title="50% like this..."> 0 </div> </div> <a href="#124690" class="name"> <strong class="user"><em>ASchmidt at Anamera dot net</em></strong></a><a class="genanchor" href="#124690"> ¶</a><div class="date" title="2020-02-06 04:42"><strong>5 years ago</strong></div> <div class="text" id="Hcom124690"> <div class="phpcode"><code><span class="html">Combining flags <br />PREG_OFFSET_CAPTURE | PREG_UNMATCHED_AS_NULL <br />will NOT result in a value of NULL for any submatched subpattern.<br /><br />Instead still results in an array for each unmatched subpattern, in turn containing:<br /><br /> array (size=2)<br /> 0 => null<br /> 1 => int -1<br /><br />Consequently your code needs to expect NULL as the string value:<br /> $matches[ {subpattern+1} ][0] === null <br />and/or a negative string offset:<br /> $matches[ {subpattern+1} ][1] < 0 <br />to detect any unmatched subpattern!</span></code></div> </div> </div> <div class="note" id="89052"> <div class="votes"> <div id="Vu89052"> <a href="/manual/vote-note.php?id=89052&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd89052"> <a href="/manual/vote-note.php?id=89052&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V89052" title="51% like this..."> 1 </div> </div> <a href="#89052" class="name"> <strong class="user"><em>skds1433 at hotmail dot com</em></strong></a><a class="genanchor" href="#89052"> ¶</a><div class="date" title="2009-02-19 06:41"><strong>16 years ago</strong></div> <div class="text" id="Hcom89052"> <div class="phpcode"><code><span class="html">here is a small tool for someone learning to use regular expressions. it's very basic, and allows you to try different patterns and combinations. I made it to help me, because I like to try different things, to get a good understanding of how things work.<br /><br /><span class="default"><?php<br />$search </span><span class="keyword">= isset(</span><span class="default">$_POST</span><span class="keyword">[</span><span class="string">'search'</span><span class="keyword">])?</span><span class="default">$_POST</span><span class="keyword">[</span><span class="string">'search'</span><span class="keyword">]:</span><span class="string">"//"</span><span class="keyword">;<br /></span><span class="default">$match </span><span class="keyword">= isset(</span><span class="default">$_POST</span><span class="keyword">[</span><span class="string">'match'</span><span class="keyword">])?</span><span class="default">$_POST</span><span class="keyword">[</span><span class="string">'match'</span><span class="keyword">]:</span><span class="string">"<>"</span><span class="keyword">;<br /><br />echo </span><span class="string">'<form method="post">'</span><span class="keyword">;<br />echo </span><span class="string">'s: <input style="width:400px;" name="search" type="text" value="'</span><span class="keyword">.</span><span class="default">$search</span><span class="keyword">.</span><span class="string">'" /><br />'</span><span class="keyword">;<br />echo </span><span class="string">'m:<input style="width:400px;" name="match" type="text" value="'</span><span class="keyword">.</span><span class="default">$match</span><span class="keyword">.</span><span class="string">'" /><input type="submit" value="go" /></form><br />'</span><span class="keyword">;<br />if (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="default">$search</span><span class="keyword">, </span><span class="default">$match</span><span class="keyword">)){echo </span><span class="string">"matches"</span><span class="keyword">;}else{echo </span><span class="string">"no match"</span><span class="keyword">;}<br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="108746"> <div class="votes"> <div id="Vu108746"> <a href="/manual/vote-note.php?id=108746&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd108746"> <a href="/manual/vote-note.php?id=108746&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V108746" title="50% like this..."> 0 </div> </div> <a href="#108746" class="name"> <strong class="user"><em>jphansen at uga dot edu</em></strong></a><a class="genanchor" href="#108746"> ¶</a><div class="date" title="2012-05-22 07:41"><strong>12 years ago</strong></div> <div class="text" id="Hcom108746"> <div class="phpcode"><code><span class="html">Here's a regex to validate against the schema for common MySQL <br /> identifiers: <br /> <br /><span class="default"><?php <br />$string </span><span class="keyword">= </span><span class="string">"</span><span class="default">$table_name</span><span class="string">"</span><span class="keyword">; <br />if (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"/[^\\d\\sa-zA-Z</span><span class="default">$_</span><span class="string">]/"</span><span class="keyword">, </span><span class="default">$string</span><span class="keyword">)) <br /> echo </span><span class="string">"Failed validation"</span><span class="keyword">; <br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="105324"> <div class="votes"> <div id="Vu105324"> <a href="/manual/vote-note.php?id=105324&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd105324"> <a href="/manual/vote-note.php?id=105324&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V105324" title="50% like this..."> 0 </div> </div> <a href="#105324" class="name"> <strong class="user"><em>itworkarounds at gmail dot com</em></strong></a><a class="genanchor" href="#105324"> ¶</a><div class="date" title="2011-08-09 09:08"><strong>13 years ago</strong></div> <div class="text" id="Hcom105324"> <div class="phpcode"><code><span class="html">You can use the following code to detect non-latin (Cyrilic, Arabic, Greek...) characters: <br /> <br /><span class="default"><?php <br />preg_match</span><span class="keyword">(</span><span class="string">"/^[a-zA-Z\p{Cyrillic}0-9\s\-]+$/u"</span><span class="keyword">, </span><span class="string">"ABC abc 1234 АБВ абв"</span><span class="keyword">); <br /></span><span class="default">?></span></span></code></div> </div> </div> <div class="note" id="96067"> <div class="votes"> <div id="Vu96067"> <a href="/manual/vote-note.php?id=96067&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd96067"> <a href="/manual/vote-note.php?id=96067&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V96067" title="50% like this..."> 0 </div> </div> <a href="#96067" class="name"> <strong class="user"><em>Anonymous</em></strong></a><a class="genanchor" href="#96067"> ¶</a><div class="date" title="2010-02-06 08:00"><strong>15 years ago</strong></div> <div class="text" id="Hcom96067"> <div class="phpcode"><code><span class="html">The regular expression for breaking-down a URI reference into its components:<br /><br /> ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?<br /> 12 3 4 5 6 7 8 9<br /><br />Source: ietf.org/rfc/rfc2396.txt</span></code></div> </div> </div> <div class="note" id="93185"> <div class="votes"> <div id="Vu93185"> <a href="/manual/vote-note.php?id=93185&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd93185"> <a href="/manual/vote-note.php?id=93185&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V93185" title="50% like this..."> 0 </div> </div> <a href="#93185" class="name"> <strong class="user"><em>marcosc at tekar dot net</em></strong></a><a class="genanchor" href="#93185"> ¶</a><div class="date" title="2009-08-27 09:31"><strong>15 years ago</strong></div> <div class="text" id="Hcom93185"> <div class="phpcode"><code><span class="html">When using accented characters and "ñ" (áéíóúñ), preg_match does not work. It is a charset problem, use utf8_decode/decode to fix.</span></code></div> </div> </div> <div class="note" id="124981"> <div class="votes"> <div id="Vu124981"> <a href="/manual/vote-note.php?id=124981&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd124981"> <a href="/manual/vote-note.php?id=124981&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V124981" title="45% like this..."> -2 </div> </div> <a href="#124981" class="name"> <strong class="user"><em>xcsv at gmx dot net</em></strong></a><a class="genanchor" href="#124981"> ¶</a><div class="date" title="2020-05-06 08:39"><strong>4 years ago</strong></div> <div class="text" id="Hcom124981"> <div class="phpcode"><code><span class="html">As of PHP 7.2, you can use the following.<br /><br />If you work with named subpatterns and dont want to bother with unnamed match result entries and unmatched subpatterns, just replace preg_match() with named_preg_match(). This filters all unwanted stuff out.<br /><br /><span class="default"><?php<br /></span><span class="keyword">function </span><span class="default">named_preg_match</span><span class="keyword">(</span><span class="default">string $pattern </span><span class="keyword">, </span><span class="default">string $subject</span><span class="keyword">, array &</span><span class="default">$matches </span><span class="keyword">= </span><span class="default">null</span><span class="keyword">, </span><span class="default">int $flags </span><span class="keyword">= </span><span class="default">0</span><span class="keyword">, </span><span class="default">int $offset </span><span class="keyword">= </span><span class="default">0</span><span class="keyword">) {<br /> </span><span class="default">$retval </span><span class="keyword">= </span><span class="default">preg_match</span><span class="keyword">(</span><span class="default">$pattern</span><span class="keyword">, </span><span class="default">$subject</span><span class="keyword">, </span><span class="default">$localmatches</span><span class="keyword">, </span><span class="default">PREG_UNMATCHED_AS_NULL </span><span class="keyword">| </span><span class="default">$flags</span><span class="keyword">, </span><span class="default">$offset</span><span class="keyword">);<br /> if (</span><span class="default">$retval</span><span class="keyword">) {<br /> foreach (</span><span class="default">$localmatches </span><span class="keyword">as </span><span class="default">$key </span><span class="keyword">=> </span><span class="default">$value</span><span class="keyword">) {<br /> if (</span><span class="default">is_int</span><span class="keyword">(</span><span class="default">$key</span><span class="keyword">)) </span><span class="default">$value </span><span class="keyword">= </span><span class="default">null</span><span class="keyword">;<br /> if (</span><span class="default">is_null</span><span class="keyword">(</span><span class="default">$value</span><span class="keyword">)) unset(</span><span class="default">$localmatches</span><span class="keyword">[</span><span class="default">$key</span><span class="keyword">]);<br /> }<br /> </span><span class="default">$matches </span><span class="keyword">= </span><span class="default">$localmatches</span><span class="keyword">;<br /> }<br /> return </span><span class="default">$retval</span><span class="keyword">;<br />}<br /></span><span class="default">?><br /></span><br />Hope this will be useful.</span></code></div> </div> </div> <div class="note" id="86525"> <div class="votes"> <div id="Vu86525"> <a href="/manual/vote-note.php?id=86525&page=function.preg-match&vote=up" title="Vote up!" class="usernotes-voteu">up</a> </div> <div id="Vd86525"> <a href="/manual/vote-note.php?id=86525&page=function.preg-match&vote=down" title="Vote down!" class="usernotes-voted">down</a> </div> <div class="tally" id="V86525" title="44% like this..."> -2 </div> </div> <a href="#86525" class="name"> <strong class="user"><em>phil dot taylor at gmail dot com</em></strong></a><a class="genanchor" href="#86525"> ¶</a><div class="date" title="2008-10-22 05:01"><strong>16 years ago</strong></div> <div class="text" id="Hcom86525"> <div class="phpcode"><code><span class="html">If you need to check for .com.br and .com.au and .uk and all the other crazy domain endings i found the following expression works well if you want to validate an email address. Its quite generous in what it will allow <br /> <br /><span class="default"><?php <br /> <br /> $email_address </span><span class="keyword">= </span><span class="string">"phil.taylor@a_domain.tv"</span><span class="keyword">; <br /> <br /> if (</span><span class="default">preg_match</span><span class="keyword">(</span><span class="string">"/^[^@]*@[^@]*\.[^@]*$/"</span><span class="keyword">, </span><span class="default">$email_address</span><span class="keyword">)) { <br /> return </span><span class="string">"E-mail address"</span><span class="keyword">; <br /> } <br /> <br /></span><span class="default">?></span></span></code></div> </div> </div></div> <div class="foot"><a href="/manual/add-note.php?sect=function.preg-match&repo=en&redirect=https://www.php.net/manual/en/function.preg-match.php">+<small>add a note</small></a></div> </section> </section><!-- layout-content --> <aside class='layout-menu'> <ul class='parent-menu-list'> <li> <a href="ref.pcre.php">PCRE Functions</a> <ul class='child-menu-list'> <li class=""> <a href="function.preg-filter.php" title="preg_​filter">preg_​filter</a> </li> <li class=""> <a href="function.preg-grep.php" title="preg_​grep">preg_​grep</a> </li> <li class=""> <a href="function.preg-last-error.php" title="preg_​last_​error">preg_​last_​error</a> </li> <li class=""> <a href="function.preg-last-error-msg.php" title="preg_​last_​error_​msg">preg_​last_​error_​msg</a> </li> <li class="current"> <a href="function.preg-match.php" title="preg_​match">preg_​match</a> </li> <li class=""> <a href="function.preg-match-all.php" title="preg_​match_​all">preg_​match_​all</a> </li> <li class=""> <a href="function.preg-quote.php" title="preg_​quote">preg_​quote</a> </li> <li class=""> <a href="function.preg-replace.php" title="preg_​replace">preg_​replace</a> </li> <li class=""> <a href="function.preg-replace-callback.php" title="preg_​replace_​callback">preg_​replace_​callback</a> </li> <li class=""> <a href="function.preg-replace-callback-array.php" title="preg_​replace_​callback_​array">preg_​replace_​callback_​array</a> </li> <li class=""> <a href="function.preg-split.php" title="preg_​split">preg_​split</a> </li> </ul> </li> </ul> </aside> </div><!-- layout --> <footer> <div class="container footer-content"> <div class="row-fluid"> <ul class="footmenu"> <li><a href="/manual/en/copyright.php">Copyright © 2001-2025 The PHP Documentation Group</a></li> <li><a href="/my.php">My PHP.net</a></li> <li><a href="/contact.php">Contact</a></li> <li><a href="/sites.php">Other PHP.net sites</a></li> <li><a href="/privacy.php">Privacy policy</a></li> </ul> </div> </div> </footer> <script src="/cached.php?t=1731172202&f=/js/ext/jquery-3.6.0.min.js"></script> <script src="/cached.php?t=1723177202&f=/js/ext/FuzzySearch.min.js"></script> <script src="/cached.php?t=1707321815&f=/js/ext/mousetrap.min.js"></script> <script src="/cached.php?t=1707321815&f=/js/ext/jquery.scrollTo.min.js"></script> <script src="/cached.php?t=1738028401&f=/js/search.js"></script> <script src="/cached.php?t=1738742401&f=/js/common.js"></script> <script type="module" src="/cached.php?t=1741309802&f=/js/interactive-examples.js"></script> <a id="toTop" href="javascript:;"><span id="toTopHover"></span><img width="40" height="40" alt="To Top" src="/images/to-top@2x.png"></a> <div id="search-modal__backdrop" class="search-modal__backdrop"> <div role="dialog" aria-label="Search modal" id="search-modal" class="search-modal" > <div class="search-modal__header"> <div class="search-modal__form"> <div class="search-modal__input-icon"> <!-- https://feathericons.com search --> <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" > <circle cx="11" cy="11" r="8"></circle> <line x1="21" y1="21" x2="16.65" y2="16.65"></line> </svg> </div> <input type="search" id="search-modal__input" class="search-modal__input" placeholder="Search docs" aria-label="Search docs" /> </div> <button aria-label="Close" class="search-modal__close"> <!-- https://pictogrammers.com/library/mdi/icon/close/ --> <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" width="24" viewBox="0 0 24 24" > <path d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"/> </svg> </button> </div> <div role="listbox" aria-label="Search results" id="search-modal__results" class="search-modal__results" ></div> <div class="search-modal__helper-text"> <div> <kbd>↑</kbd> and <kbd>↓</kbd> to navigate • <kbd>Enter</kbd> to select • <kbd>Esc</kbd> to close </div> <div> Press <kbd>Enter</kbd> without selection to search using Google </div> </div> </div> </div> </body> </html>