pcdhan
pcdhan

Reputation: 87

PHP preg_match using RegEx to match a word

I want to find all the demo words using PHP and regEx.

$input ='demo';
$pattern = ''; //$input can be used along with regex, please help here 
$text = 'This is dem*#o text, contains de12mo3 text, is .demo23* text' 

if(preg_match($pattern, $text))
{
 echo 'found';
}else{
 echo'not found';
}

the search word demo in the text may be present in the following format

1) may start with special characters/numbers Eg. "12*demo"
2) may contain special characters/numbers within the word Eg.  "de12*mo"
3) may end with special characters/numbers Eg. "demo12*"

please help I am stuck, thanks in advance!

Note: The $input can be max. of 15 in length

Upvotes: 1

Views: 551

Answers (3)

Bailey Parker
Bailey Parker

Reputation: 15905

The Solution

I would start by removing all special characters and numbers from the string, and then matching the word using word boundaries:

$cleaned = preg_replace('/[^a-z ]+/i', '', 'This is dem*#o text, contains de12mo3 text, is .demo23* text');

preg_match_all('/\bdemo\b/i', $cleaned, $matches, PREG_OFFSET_CAPTURE);

var_dump($matches);

Will give you (Codepad Demo):

array(1) {
  [0] => array(3) {
    [0] => array(2) {
      [0] => string(4) "demo"
      [1] => int(8)
    }

    [1] => array(2) {
      [0] => string(4) "demo"
      [1] => int(27)
    }

    [2] => array(2) {
      [0] => string(4) "demo"
      [1] => int(40)
    }
  }
}

Explanation

The first line replaces any characters in your string (called the subject argument) that match /[a-z ]+/i with '', essentially removing the characters. The regex matches any character (or group of characters) that is not (^) the letters a-z or a space. The i flag tells regex that the search should be case insensitive (This saves us from writing a-zA-Z).

The next line uses word boundaries to match the word 'demo'. However, you could substitute in any word.

New Regex Techniques

Upvotes: 3

flec
flec

Reputation: 3019

/\b[^a-z]*d[^a-z]*e[^a-z]*m[^a-z]*o[^a-z]*\b/i

Matches anything but a-z between the demo characters

Upvotes: 1

Menztrual
Menztrual

Reputation: 41597

Probably not efficient; But you could use this:

/(.*)d(.*)e(.*)m(.*)o(.*)/i

That would match anything.

Upvotes: 0

Related Questions