Matching date in string - php

Having difficuties matching a date in the given string. Tried a myriad of regex suggestions. Keep on getting "No date found", while the date is obviously there: 07/02/2016.
What am I missing?
function matchDate($str) {
if (preg_match('/\b(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}\b/', $str, $mDdate)) {
return $mDdate[0];
} else {
return "No date found.";
}
}
$str = "FISH HOUSE KINGS FISH HOUSE 100 W Broadway Long Beach, Ca. 90802 562-432-7463 Server: Ezbeth 07/02/2016 Table 44/1 8:38 PM 60018 10.00 18.75 enon Drop Fried atiish D I obster Crunchy Roll callap and Shrimp Char D 13.50 22.50 6.95 101.60 Cheeseburger 1/2lb D (2 14.95) 29.90 Caesar Salad Subtotal Tax 9.14 110.74 110.74 Total Ba 1ance Due KING'S FISH HOUSE Welcome To The House That Seafood Built Find Us Online #KingsFishHouse ";
echo matchDate($str);

For your given example, this is
\b\d{2}/\d{2}/\d{4}\b
See a demo on regex101.com.

The problem with your example regex is that you need to escape the / character in the pattern.
If you don't escape the / character, regex will understand it as the end of the regex pattern.
Based on your example, the solution should be:
\b(0?[1-9]|1[012])\/(0?[1-9]|[12][0-9]|3[01])\/(19|20)?[0-9]{2}\b
You can see it in action in this demo

Related

Regex PHP, Find characters in specific position

I explain my problem : I'm working on different kind of address
" 25 Down Street 15000 London "
" 25 B Down Street 15000 London "
" Building A 25 Down Street 15000 London "
I found a way to determine which is the number of the street on all case with this regex :
`^([1-9][0-9]{0,2}(?:\s*[A-Z])?)\b`
But now i got a problem that i can't solve, i need when the case is real to determine characters which are before the street's number .
Example : " Building 2 25 Down Street 15000 London " i need here to find only "Building 2"
I understand that i have to find characters before the first number of this string.
Keep searching on my own but will be great if someone got a solution for me .
Thank you .
Edit my code now is :
preg_match('/^(.*?)\d+\s+\D+/', $cleanAdressNode, $result, PREG_OFFSET_CAPTURE,0);
print $result[0][0];
return $result[0][0];
and the result now is : Résidence Les Thermes 1 15 boulevard Jean Jaurès instead of only : Résidence Les Thermes 1
How about:
preg_match('/^(\D*)/', $str, $match);
You will find in $match[1] everything that is not a digit at the begining of the string.
According to your example:
preg_match('/^(.*?)\d+\s+\D+/', $str, $match);
If you only want to match the first non-numeric characters, ^([^0-9]*) should do the trick. It uses class negation to grab every non-numeric characters at the start of the string.

Seprate movie name and year from moviefile name

I have a file name like this
Birdman.2014.DVDSCR.X264-PLAYNOW.mkv
Divergent (2014) 720p Blu-Ray x2649 [Dual-Audio][English DD 5.1 +
Hindi DD 5.1] - Mafiaking - TeamTNT ExClusive.mkv
Cradle 2 The Grave 2003 HDTVRip 720p Dual-Audio[Eng+Hindi] ~ BRAR
I have to seperated movie name and year
For getting year in use perg_match like
$s="Divergent (2014) 720p Blu-Ray x2649 [Dual-Audio][English DD 5.1 + Hindi DD 5.1] - Mafiaking - TeamTNT ExClusive.mkv";
if (preg_match('/\b\d{4}\b/', $s, $matches)) {
$year = $matches[0];
}
echo $year;
result :- 2014 //working perfect
But I also want to get movie name like
Divergent
Birdman
Cradle 2 The Grave
I also check with this link
Extracting movie name and year from string were year is optional
But nothing happen
How i get it? Please help or provide hint to achive it.
^.+?(?=\s*[(.]?(\d{4}))
You can try this.The movie name will be in match and year in the first group.See demo.
https://regex101.com/r/vA0yQ3/2
$re = "/^.+?(?=\\s*[(.]?(\\d{4}))/mi";
$str = "\n\nBirdman.2014.DVDSCR.X264-PLAYNOW.mkv\n\nDivergent (2014) 720p Blu-Ray x2649 [Dual-Audio][English DD 5.1 + Hindi DD 5.1] - Mafiaking - TeamTNT ExClusive.mkv\n\nCradle 2 The Grave 2003 HDTVRip 720p Dual-Audio[Eng+Hindi] ~ BRAR\n";
preg_match_all($re, $str, $matches);

How can I match a string between two other known strings and nothing else with REGEX?

I want to extract a string between two other strings. The strings happen to be within HTML tags but I would like to avoid a conversation about whether I should be parsing HTML with regex (I know I shouldn't and have solved the problem with stristr() but would like to know how to do it with regular expressions.
A string might look like this:
...uld select “Apply” below.<br/><br/><b>Primary Location</b>: United States-Washington-Seattle<br/><b>Travel</b>: Yes, 75 % of the Time <br/><b>Job Type</b>: Standard<br/><b>Region</b>: US Service Lines: ASL - Business Intelligence<br/><b>Job</b>: Business Intelligence<br/><b>Capability Group</b>: Con/Sol - BI&C<br/><br/>LOC:USA
I am interested in <b>Primary Location</b>: United States-Washington-Seattle<br/> and want to extract 'United States-Washington-Seattle'
I tried '(?<=<b>Primary Location</b>:)(.*?)(?=<br/>)' which worked in RegExr but not PHP:
preg_match("/(?<=<b>Primary Location</b>:)(.*?)(?=<br/>)/", $description,$matches);
You used / as regex delimiter, so you need to escape it if you want to match it literally or use a different delimiter
preg_match("/(?<=<b>Primary Location</b>:)(.*?)(?=<br/>)/", $description,$matches);
to
preg_match("/(?<=<b>Primary Location<\/b>:)(.*?)(?=<br\/>)/", $description,$matches);
or this
preg_match("~(?<=<b>Primary Location</b>:)(.*?)(?=<br/>)~", $description,$matches);
Update
I just tested it on www.writecodeonline.com/php and
$description = "uld select “Apply” below.<br/><br/><b>Primary Location</b>: United States-Washington-Seattle<br/><b>Travel</b>: Yes, 75 % of the Time <br/><b>Job Type</b>: Standard<br/><b>Region</b>: US Service Lines: ASL - Business Intelligence<br/><b>Job</b>: Business Intelligence<br/><b>Capability Group</b>: Con/Sol - BI&C<br/><br/>LOC:USA";
preg_match("~(?<=<b>Primary Location</b>:)(.*?)(?=<br/>)~", $description, $matches);
print_r($matches);
is working. Output:
Array ( [0] => United States-Washington-Seattle [1] => United States-Washington-Seattle )
You can also get rid of the capturing group and do
$description = "uld select “Apply” below.<br/><br/><b>Primary Location</b>: United States-Washington-Seattle<br/><b>Travel</b>: Yes, 75 % of the Time <br/><b>Job Type</b>: Standard<br/><b>Region</b>: US Service Lines: ASL - Business Intelligence<br/><b>Job</b>: Business Intelligence<br/><b>Capability Group</b>: Con/Sol - BI&C<br/><br/>LOC:USA";
preg_match("~(?<=<b>Primary Location</b>:).*?(?=<br/>)~", $description, $matches);
print($matches[0]);
Output
United States-Washington-Seattle

PHP: How to find the beginning and end of a substring in a string?

This is the content of one mysql table field:
Flash LEDs: 0.5W
LED lamps: 5mm
Low Powers: 0.06W, 0.2W
Remarks(1): this is remark1
----------
Accessories: Light Engine
Lifestyle Lights: Ambion, Crane Fun
Office Lights: OL-Deluxe Series
Street Lights: Dolphin
Retrofits: SL-10A, SL-60A
Remarks(2): this is remark2
----------
Infrared Receiver Module: High Data Rate Short Burst
Optical Sensors: Ambient Light Sensor, Proximity Sensor, RGB Color Sensor
Photo Coupler: Transistor
Remarks(3): this is remark3
----------
Display: Dot Matrix
Remarks(4): this is remark4
Now, I want to read the remarks and store them in a variable. Remarks(1), Remarks(2), etc. are fixed. 'this is remark1', etc. come from form input fields, so they are flexible.
Basically what I need is: Read everything between 'Remarks(1):' and '--------' and save it in a variable.
Thanks for your help.
You can use regex:
preg_match_all("~Remarks\(([^)]+)\):([^\n]+)~", $str, $m);
As seen on ideone.
The regex will put X in match group 1, Y in match group 2 (Remarks(X): Y)
This would be a job for regular expressions, which allow you to match on exactly the kinds of rules your requirements express. Here is a tutorial for you.
Use preg function for this or otherwise you can explode and implode function to get correct result. Don't Use Substring it may not provide correction.
Example of Implode and Explode Function for your query string :
$sdr = "Remarks(4): this is remark4";
$sdr1 = explode(":",$sdr);
$frst = $sdr1[0];
$sdr2 = array_shift($sdr1);
$secnd = implode(" ", $sdr1);
echo "First String - ".$frst;
echo "<br>";
echo "Second String - ".$secnd;
echo "<br>";
Your Answer :
First String - Remarks(4)
Second String - this is remark4

Function not searching for a specific word

This is quite weird but my search function can search for any word except the word "grinder" from my item table. I have tried everything but it does not seem to search for that word. Can anyone help me please?
CREATE FULLTEXT INDEX item_name_other_name_desc_index
ON item (name,other_name,description)
public static function Search($string)
{
$delims = ',.; ';
$word = strtok($string,$delims);
while($word)
{
$result['accepted'][] = $word;
$word = strtok($delims);
}
$string = implode(" ", $result['accepted']);
$sql = 'SELECT item_id,name,other_name,description,price,discounted_price, thumbnail_photo,large_photo
FROM item
WHERE
MATCH(name,other_name,description)
AGAINST(:string)' ;
$parameters = array(':string' => $string);
$result['items'] = DB::GetAll($sql,$parameters);
return $result;
}
The names of the items:
9 In 15 AMP Motor Angle Grinder
8 In Bench Grinder
1/4 In Angle Die Grinder
7 In Angle Grinder
3 In Straight Grinder
Ryobi HP512K cordless drill/driver kit
6-Pack Spray Paint
Non-Contact Voltage Tester
When I change the above to :
9 In 15 AMP Motor Angle Grinder
8 In Bench Grind
1/4 In Angle Die Grind
7 In Angle Grind
3 In Straight Grind
Ryobi HP512K cordless drill/driver kit
6-Pack Spray Paint
Non-Contact Voltage Tester
and I search for Grinder, the record => 9 In 15 AMP Motor Angle Grinder is being displayed.
By default, mysql fulltext search treats a word that occurs in more than 50% or the rows as a stopword ( http://dev.mysql.com/doc/refman/5.1/en/fulltext-natural-language.html ). Try searching in boolean mode ( http://dev.mysql.com/doc/refman/5.1/en/fulltext-boolean.html ), where you don't have 50% threshold.
Does it make any different if the word Grinder is moved within the text, so "15 AMP Motor Angle Grinder" would be "15 AMP Motor Angle Grinder Test"? I ask this because Grinder is always the last work of the name.
I'm not an expert on full text searching, but this is where I would start.

Categories