preg_match_all for this pattern - php
i have this pattern and i ant to use it to extract the numbers after the /image/ field and i have tried this pattern and i have checked online at http://www.functions-online.com/preg_match_all.html and it is giving desired output for the first link but for other links it is not giving desired output
here is my pattern
/\sample.com\/image\/(.*)\//
and here is my string
Mario Ermito photos by sample.com Mario Ermito Latest News, Photos, Biography, Videos and Wallpapers [img]http://xyz.sample.com/image/4205476/600full-mario-ermito.jpg[/img][img]http://xyz.sample.com/image/4453948/600full-my-profile.jpg[/img][img]http://xyz.sample.com/image/427185/600full-eagle-eye-poster.jpg[/img][img]http://xyz.sample.com/image/1323868/600full-alexis-bledel.jpg[/img][img]http://xyz.sample.com/image/2505314/600full-monroe-lee.jpg[/img][img]http://xyz.sample.com/image/3300481/600full-cindy-crawford.jpg[/img][img]http://xyz.sample.com/image/1046646/600full-pitura-freska.jpg[/img][img]http://xyz.sample.com/image/4322305/600full-kristin-kreuk.jpg[/img][img]http://xyz.sample.com/image/4261476/600full-kang-so--ra.jpg[/img][img]http://xyz.sample.com/image/3386911/600full-summer-brielle.jpg[/img][img]http://xyz.sample.com/image/4663949/600full-the-closer-artwork.jpg[/img]
eg
i want to extract only number after /image/ field i dont want image name my desired output is
4205476
4453948
427185
etc all numbers from string
Use this Regular Expression ~\/\image\/(.*?)\/~
<?php
$str=' Mario Ermito photos by sample.com Mario Ermito Latest News, Photos, Biography, Videos and Wallpapers [img]http://xyz.sample.com/image/4205476/600full-mario-ermito.jpg[/img][img]http://xyz.sample.com/image/4453948/600full-my-profile.jpg[/img][img]http://xyz.sample.com/image/427185/600full-eagle-eye-poster.jpg[/img][img]http://xyz.sample.com/image/1323868/600full-alexis-bledel.jpg[/img][img]http://xyz.sample.com/image/2505314/600full-monroe-lee.jpg[/img][img]http://xyz.sample.com/image/3300481/600full-cindy-crawford.jpg[/img][img]http://xyz.sample.com/image/1046646/600full-pitura-freska.jpg[/img][img]http://xyz.sample.com/image/4322305/600full-kristin-kreuk.jpg[/img][img]http://xyz.sample.com/image/4261476/600full-kang-so--ra.jpg[/img][img]http://xyz.sample.com/image/3386911/600full-summer-brielle.jpg[/img][img]http://xyz.sample.com/image/4663949/600full-the-closer-artwork.jpg[/img]';
preg_match_all('~\/\image\/(.*?)\/~', $str, $matches);
print_r($matches[1]);
OUTPUT :
Array
(
[0] => 4205476
[1] => 4453948
[2] => 427185
[3] => 1323868
[4] => 2505314
[5] => 3300481
[6] => 1046646
[7] => 4322305
[8] => 4261476
[9] => 3386911
[10] => 4663949
)
You need to adjust your regular expression:
$regex = '#sample\.com/image/([0-9]+)/#'
preg_match_all('#sample\.com/image/([0-9]+)/#', $str, $m);
print_r($m);
Expected output:
Array
(
[0] => Array
(
[0] => sample.com/image/4205476/
[1] => sample.com/image/4453948/
[2] => sample.com/image/427185/
[3] => sample.com/image/1323868/
[4] => sample.com/image/2505314/
[5] => sample.com/image/3300481/
[6] => sample.com/image/1046646/
[7] => sample.com/image/4322305/
[8] => sample.com/image/4261476/
[9] => sample.com/image/3386911/
[10] => sample.com/image/4663949/
)
[1] => Array
(
[0] => 4205476
[1] => 4453948
[2] => 427185
[3] => 1323868
[4] => 2505314
[5] => 3300481
[6] => 1046646
[7] => 4322305
[8] => 4261476
[9] => 3386911
[10] => 4663949
)
)
Now you'll need to keep in mind that PHP will return everything it matches including the undesired parts of the regex string.
From the PHP Manual:
http://www.php.net/manual/en/function.preg-match-all.php
Orders results so that $matches[0] is an array of full pattern
matches, $matches[1] is an array of strings matched by the first
parenthesized subpattern, and so on.
Try this:
/.*sample\.com\/image\/(\d+)\/.*/
Debuggex Demo
Related
How to split 1 array into 2 arrays, remove certain items, and combine them again into 1 array in PHP?
i want to create something using array. I have 1 array and i need to split it into 2 array. After that search specific items from both array and remove it then combine it 2 array into 1 array. How do i do that? I already try to use unset for array but confuse how to use it for specific key since my array data format like 16/2/1/1 and 16/2/1/5. I need to remove data which have 1. My format array is like this Array ( [1] => Array ( [0] => 16/2/1/1 --> remove this have 1 after 2 [1] => 16/2/0/2 [2] => 16/2/0/3 [3] => 16/2/0/4 [4] => 16/2/0/5 [5] => 16/2/0/6 [6] => 16/2/0/7 [7] => 16/2/0/8 [8] => 16/2/0/9 [9] => 16/2/0/10 [10] => 16/2/0/11 [11] => 16/2/0/12 [12] => 16/2/0/13 [13] => 16/2/0/14 [14] => 16/2/0/15 [15] => 16/2/0/16 ) [2] => Array ( [0] => 16/2/0/1 [1] => 16/2/0/2 [2] => 16/2/0/3 [3] => 16/2/0/4 [4] => 16/2/1/5 --> and this have 1 after 2 before 5 [5] => 16/2/0/6 [6] => 16/2/0/7 [7] => 16/2/0/8 [8] => 16/2/0/9 [9] => 16/2/0/10 [10] => 16/2/0/11 [11] => 16/2/0/12 [12] => 16/2/0/13 [13] => 16/2/0/14 [14] => 16/2/0/15 [15] => 16/2/0/16 ) ) i expect the output something like (after combine) Array ( [0] => 16/2/0/2 [1] => 16/2/0/3 [2] => 16/2/0/4 [3] => 16/2/0/6 [4] => 16/2/0/7 [5] => 16/2/0/8 [6] => 16/2/0/9 [7] => 16/2/0/10 [8] => 16/2/0/11 [9] => 16/2/0/12 [10] => 16/2/0/13 [11] => 16/2/0/14 [12] => 16/2/0/15 [13] => 16/2/0/16 ) Thanks for time to help me.
Make the array unique and then extract items that are digits/digits/NOT 1/digits: $array = preg_grep('#^\d+/\d+/[^1]/\d+#', array_unique($array));
I would use preg_grep which allows you to search an array using a Regular expression. $array =[ '16/2/0/13', '16/2/0/16', '16/2/1/5' ]; $array = preg_grep('~^16/2/0/\d+$~', $array); print_r($array); Output Array ( [0] => 16/2/0/13 [1] => 16/2/0/16 ) Sandbox The Regex ^ match start of string 16/2/0/ - match literally (at the start of string, see above) \d+ any digit one or more $ match end of string So Regular expressions is a way to do pattern matching, in this case the pattern is 16/2/0/{n} where {n} is any number. So by doing this we can find only those items that match that pattern. Then if you have duplicates, you can do array_unique() and easily remove those. There are many ways to do this array_filter with a custom callback etc. But this is the most straightforward way (if you know Regex).
Match numbers separated with colons, semicolons optionally
I have the following string: objectsA=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1;:objectsB= And I want to know how can I match, optionally, the numbers inside objectsA and objectsB but put into consideration, that may one or another can be empty. For example: objectsA can be: objectsA=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1; But also can be objectsA=:objectsB=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1; Or even objectsA=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1;:objectsB=objectsA=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1; The current code: $line2 = " 2016-07-31 00:39:00 debian-8gb-sfo2-01 gdeliveryd: notice : formatlog:trade:roleidA=3328:roleidB=2161:moneyA=0:moneyB=0:objectsA=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1;:objectsB="; if (strpos($line2, ':trade:roleidA=3328') > 0) { if (!preg_match('/([\d-: ]+)\s*.*\sformatlog:trade:roleidA=(\d+):(.*)roleidB=(\d+):moneyA=(\d+):moneyB=(\d+):objectsA=(regexhere):objectsB=(regexhere).*$/', $line2, $c)) { // error occured } echo '<pre>'; print_r($c); } And the problems is that the current regex ((\d+\,\d+\,\d\;)+|) has an weird behavior, that can't happen. Output: Array ( [0] => 2016-07-31 00:39:00 debian-8gb-sfo2-01 gdeliveryd: notice : formatlog:trade:roleidA=3328:roleidB=2161:moneyA=0:moneyB=0:objectsA=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1;:objectsB=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1; [1] => 2016-07-31 00:39:00 [2] => 3328 [3] => [4] => 2161 [5] => 0 [6] => 0 [7] => 38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1; [8] => 38155,39,1; [9] => 38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1; [10] => 38155,39,1; ) For some reason, if the objects has the same size, the regex are creating a new array index, wich shouldn't happen. The expected result: Array ( [0] => 2016-07-31 00:39:00 debian-8gb-sfo2-01 gdeliveryd: notice : formatlog:trade:roleidA=3328:roleidB=2161:moneyA=0:moneyB=0:objectsA=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1;:objectsB=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1; [1] => 2016-07-31 00:39:00 [2] => 3328 [4] => 2161 [5] => 0 [6] => 0 [7] => 38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1; [8] => 38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1; )
Regex: ^(?:\s?\d+(?:[-:]\d+){2}){2}|\w+=\K[^:]+ Details: (?:) Non-capturing group [] Match a single character present in the list \K Resets the starting point of the reported match + Matches between one and unlimited times | Or PHP code: $string = "2016-07-31 00:39:00 debian-8gb-sfo2-01 gdeliveryd: notice : formatlog:trade:roleidA=3328:roleidB=2161:moneyA=0:moneyB=0:objectsA=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1;:objectsB=38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1;"; preg_match_all('~^(?:\s?\d+(?:[-:]\d+){2}){2}|\w+=\K[^:]+~', $string, $matches); print_r($matches[0]); Output: Array ( [0] => 2016-07-31 00:39:00 [1] => 3328 [2] => 2161 [3] => 0 [4] => 0 [5] => 38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1; [6] => 38155,54,1;38155,53,1;38155,45,1;38155,47,1;38155,46,1;2000,55,1;38155,50,1;38155,49,1;38155,48,1;38155,40,1;38155,41,1;38155,42,1;38155,43,1;38155,51,1;38155,52,1;38155,44,1;38155,35,1;38155,33,1;38155,32,1;38155,34,1;38155,36,1;38155,38,1;38155,39,1; ) Code demo
For are navigating through this question, sometimes: less is more. The pattern (.*) will do the trick. ([\d-: ]+)\s*.*\sformatlog:trade:roleidA=(\d+):roleidB=(\d+):moneyA=(\d+):moneyB=(\d+):objectsA=(.*):objectsB=(.*).*$
preg_match to show lines containing one string and one of the other two
I've got an array in php: Array ( [0] => sth!Man!Tree!null [1] => sth!Maning!AppTree!null [2] => sth!Man!Lake!null [3] => sth!Man!Tree!null [4] => sth!Man!AppTree!null [5] => sth!Maning!AppTree!null [6] => sth!Man!Tree!null [7] => sth!Maning!AppTree!null [8] => sth!Maning!AppTree!null [9] => sth!Man!Tree!null [10] => sth!Man!Tree!null [11] => sth!Man!Tree!null [12] => sth!Man!Tree!null [12] => sth!Man!Lake!null [13] => sth!Maning!Tree!null ) and this preg_match function: preg_match("/Man/i", $line) && (preg_match("/!Tree!/i", $line) || preg_match("/!Lake!/i", $line)) My goal is to change it to one preg_match regex function to display only lines with Man and Tree or Man and Lake. Is it possible?
You can use the following regex: (?i)\b(?:Lake|Tree)\b.*\bMan\b|\bMan\b.*\b(?:Tree|Lake)\b See demo. The word boundaries match only the whole words, (?i) inline mode option enables case-insensitive search, and we need at least two main alternatives to account for different positions of Man and Lake/Tree. Sample code: $re = "/(?i)\\b(?:Lake|Tree)\\b.*\\bMan\\b|\\bMan\\b.*\\b(?:Tree|Lake)\\b/"; $str = " Man and Tree or Man and Lake. Is it possible?"; preg_match($re, $str, $matches);
preg_match("/Man!(?:Tree|Lake)/i", $line, $matches) should do it most efficiently.
preg_split with regex giving incorrect output
I'm using preg_split to an string, but I'm not getting desired output. For example $string = 'Tachycardia limit_from:1900-01-01 limit_to:2027-08-29 numresults:10 sort:publication-date direction:descending facet-on-toc-section-id:Case Reports'; $vals = preg_split("/(\w*\d?):/", $string, NULL, PREG_SPLIT_DELIM_CAPTURE); is generating output Array ( [0] => Tachycardia [1] => limit_from [2] => 1900-01-01 [3] => limit_to [4] => 2027-08-29 [5] => numresults [6] => 10 [7] => sort [8] => publication-date [9] => direction [10] => descending facet-on-toc-section- [11] => id [12] => Case Reports ) Which is wrong, desire output it Array ( [0] => Tachycardia [1] => limit_from [2] => 1900-01-01 [3] => limit_to [4] => 2027-08-29 [5] => numresults [6] => 10 [7] => sort [8] => publication-date [9] => direction [10] => descending [11] => facet-on-toc-section-id [12] => Case Reports ) There something wrong with regex, but I'm not able to fix it.
I would use $vals = preg_split("/(\S+):/", $string, NULL, PREG_SPLIT_DELIM_CAPTURE); Output is exactly like you want
It's because the \w class does not include the character -, so i would expand the \w with that too: /((?:\w|-)*\d?):/
Try this regex instead to include '-' or other characters in your splitting pattern: http://regexr.com?32qgs ((?:[\w\-])*\d?):
preg_match list of urls without spaces
I have this list of urls: http://test1.google.com/test1/12345http://test2.google.com/test2/12345http://test3.google.com/test4/12345http://test1.google.com/test1/12345http://test1.google.com/test1/12345http://test1.google.com/test1/12345http://test1.google.com/test1/12345http://test1.google.com/test1/12345 It's just an example, I want to preg_match_all a list of valid urls that doesn't have space to seperate between them, so, I will get it in an array and each cell is different url.
No need for preg_match IMHO: <?php $links = 'http://test1.google.com/test1/12345http://test2.google.com/test2/12345http://test3.google.com/test4/12345http://test1.google.com/test1/12345http://test1.google.com/test1/12345http://test1.google.com/test1/12345http://test1.google.com/test1/12345http://test1.google.com/test1/12345'; $links = array_map(function($chunk){return 'http://'.$chunk;}, explode('http://', $links)); array_shift($links); print_r($links); Demo, Output: Array ( [0] => http://test1.google.com/test1/12345 [1] => http://test2.google.com/test2/12345 [2] => http://test3.google.com/test4/12345 [3] => http://test1.google.com/test1/12345 [4] => http://test1.google.com/test1/12345 [5] => http://test1.google.com/test1/12345 [6] => http://test1.google.com/test1/12345 [7] => http://test1.google.com/test1/12345 )