Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP regular expression start and end with given strings

Tags:

regex

php

I have a string like this 05/15/2015 09:19 PM pt_Product2017.9.abc.swl.px64_kor_7700 I need to select the pt_Product2017.9.abc.swl.px64_kor from that. (start with pt_ and end with _kor)

$str = "05/15/2015 09:19 PM pt_Product2017.9.abc.swl.px64_kor_7700";
preg_match('/^pt_*_kor$/',$str, $matches);

But it doesn't work.

like image 506
Nayana Adassuriya Avatar asked Oct 31 '25 08:10

Nayana Adassuriya


2 Answers

You need to remove the anchors, adda \b at the beginning to match pt_ preceded with a non-word character, and use a \S with * (\S shorthand character class that matches any character but whitespace):

preg_match('/\bpt_\S*_kor/',$str, $matches);

See regex demo

In your regex,^ and $ force the regex engine to search for the ptat the beginning and _kor at the end of the string, and _* matches 0 or more underscores. Note that regex patterns are not the same as wildcards.

In case there can be whitespace between pt_ and _kor, use .*:

preg_match('/\bpt_.*_kor/',$str, $matches);

I should also mention greediness: if you have pt_something_kor_more_kor, the .*/\S* will match the whole string, but .*?/\S*? will match just pt_something_kor. Please adjust according to your requirements.

like image 118
Wiktor Stribiżew Avatar answered Nov 02 '25 22:11

Wiktor Stribiżew


^ and $ are the start and end of the complete string, not only the matched one. So use simply (pt_.+_kor) to match everything between pt_ and _kor: preg_match('/(pt_+_kor)/',$str, $matches);

Here's a demo: https://regex101.com/r/qL4fW9/1

like image 24
Reeno Avatar answered Nov 02 '25 23:11

Reeno



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!