i got a piece of code that so far returns me data like this when i use print $result;
ssl_card_number=41**********1111
ssl_exp_date=0213
ssl_amount=132.86
ssl_salestax=0.00
ssl_invoice_number=5351353519500
ssl_result=0
ssl_result_message=APPROVED
ssl_txn_id=00000000-0000-0000-0000-00000000000
ssl_approval_code=123456
ssl_cvv2_response=P
ssl_avs_response=X
ssl_account_balance=0.00
ssl_txn_time=11/21/2012 12:38:20 PM
thats from view page source.
and the page itself shows it as :
ssl_card_number=41**********1111 ssl_exp_date=0213 ssl_amount=132.86 ssl_salestax=0.00 ssl_invoice_number=8601353519473 ssl_result=0 ssl_result_message=APPROVED ssl_txn_id=00000000-0000-0000-0000-00000000000 ssl_approval_code=123456 ssl_cvv2_response=P ssl_avs_response=X ssl_account_balance=0.00 ssl_txn_time=11/21/2012 12:37:54 PM
i need to be able to handle each of the "keys" in a better way and dont know how to explode them maybe ?
One possible approach:
parse_str(preg_replace('#\s+(?=\w+=)#', '&', $result), $array);
var_dump($array);
Explanation: preg_replace will turn all the whitespace before the param names into '&' symbol - making this string similar to the regular GET request url. Then parse_str (the function created specifically for parsing such urls) will, well, parse this string (sent as the first param), making an associative array of it.
In fact, you don't even have to use preg_replace here, if each param=value string begins from a new line; str_replace("\n", '&') should do the trick.
An alternative approach:
$pairs = preg_split('#\s+(?=\w+=)#', $x);
foreach ($pairs as $pair) {
list ($key, $value) = explode('=', $pair, 2);
$array[$key] = $value;
}
Here you first create an array of 'key-value pair' strings, then split each element by =: the first part would be the key, the second - the value.
You can use the regular expression reported by #raina77ow or you could use explodes (riskier):
<?php
$tmps = explode("\n",$result); //this gives you each line separate
foreach($tmps as $tmp){
list($key,$value) = explode('=',$tmp,2);
echo $key.' has value '.$value."\n";
//you can even create vars with the "key" if you are sure that they key is a "clean" string:
$$key=$value;
//or put everything into an array - similar to the regexp
$result_array[$key] = $value;
}
?>
Related
Is it possible with php to make a string of, say, <a>-elements comma-separated?
The situation is that a foreach loop appends a number of <a> links to an $output variable one after the other:
$output = '<a>link</a><a>link</a><a>link</a><a>link</a><a>link</a>';
Is it afterwards possible in php to comma-separate them and achieve the below string?
$output = '<a>link</a>,<a>link</a>,<a>link</a>,<a>link</a>,<a>link</a>';
Or is the most efficient way to add the comma inside the foreach loop (and then to use an if-command to skip the last one, or something like that, since that will add one comma too many)?
$output = preg_replace("/a><a","/a>,<a",$output);
I'd argue that the array implode method is probably most common way to concatenate multiple elements like this, which has already been posted in another answer.
Depending on your situation, this might however not always be the case, so for the sake of completion I'd like to add that you can also use the rtrim function to easily remove any trailing commas when concatenating strings:
foreach($links as $link) {
$output .= '<a>link</a>,';
}
$output = rtrim($output, ',');
Documentation for rtrim can be read here
A simple replace might do the job for you:
preg_replace('/a><a/','a>,<a',$s);
In your foreach loop, rather than concatenating the item on to the end of an existing string, push them to an array:
$parts = array();
foreach($list as $item){
$parts[] = "<a>$item</a>";
}
Then, you can simply join (implode) the array elements together to get your desired result:
$output = implode(',', $parts);
there are 2 solutions
solution 1 (with str_replace()):
$output = '<a>link</a><a>link</a><a>link</a><a>link</a><a>link</a>';
echo str_replace("</a>","</a>,", $output);
Solution 2 (with explode and implode method):
$exploded = explode("</a>",$output);
echo implode("</a>,", $exploded);
Side Note: you can remove the last `"," by using rtrim() method
You can replace </a> with </a>,, then trim the last `,', check Demo
echo rtrim(str_replace("</a>","</a>,",$output),",");
I need to check if URL contains the term: "cidades".
For example:
http://localhost/site/cidades/sp/sorocaba
So, if positive, then I need to create two or three variables with the remaining content without the " / ", in this case:
$var1 = "sp";
$var2 = "sorocaba";
These variables will be cookies values in the beggining of the page, then, some sections will use as wp-query these values to filter.
This should work for you:
Here I check with preg_match() if the search word is in the url $str between two slashes. If yes I get the substr() from the url after the search word and explode() it into an array with a slash as delimiter. Then you can simply loop through the array an create the variables with complex (curly) syntax.
<?php
$str = "http://localhost/site/cidades/sp/sorocaba";
$search = "cidades";
if(preg_match("~/$search/~", $str, $m, PREG_OFFSET_CAPTURE)) {
$arr = explode("/", substr($str, $m[0][1]+strlen($m[0][0])));
foreach($arr as $k => $v)
${"var" . ($k+1)} = $v;
}
echo $var1 . "<br>";
echo $var2;
?>
output:
sp
sorocaba
Here are two functions that will do it for you:
function afterLast($haystack, $needle) {
return substr($haystack, strrpos($haystack, $needle)+strlen($needle));
}
And PHP's native explode.
First call afterLast, passing the /cidades/ string (or just cidades if you don't expect the slashes). Then take the result and explode on / to get your resulting array.
It would look like:
$remaining_string = afterLast('/cidades/', $url);
$items = explode('/', $remaining_string)
Just note that if you do not include the / marks with the afterLast call, your first element in the explode array will be empty.
I think this solution is better, since the resulting array will support any number of values, not just two.
How can I prepend a string, say 'a' stored in the variable $x to each line of a multi-line string variable using PHP?
Can also use:
echo preg_replace('/^/m', $prefix, $string);
The / are delimiters. The ^ matches the beginning of a string. the m makes it multiline.
demo
There are many ways to achieve this.
One would be:
$multi_line_var = $x.str_replace("\n", "\n".$x, $multi_line_var);
Another would be:
$multi_line_var = explode("\n", $multi_line_var);
foreach($multi_line_var AS &$single_line_var) {
$single_line_var = $x.$single_line_var;
}
$multi_line_var = implode("\n", $multi_line_var);
Or as a deceitfully simple onliner:
$multi_line_var = $x.implode("\n".$x, explode("\n", $multi_line_var));
The second one is dreadfully wasteful compared to the first. It allocates memory for an array of strings. It runs over each array item and modifies it. And the glues the pieces back together.
But it can be useful if one concatenation is not the only alteration you're doing to those lines of text.
Because of your each line requirement, I would first split the string to an array using explode, then loop through the array and add text to the beginning of each line, and then turn the array back to a string using implode. As long as the number of lines is not very big, this can be a suitable solution.
Code sample:
$arr = explode("\n", $x);
foreach ($arr as $key => $value) {
$arr[$key] = 'a' . $arr[$key];
}
$x = implode("\n", $arr);
Example at: http://codepad.org/0WpJ41LE
I need a regular expression for PHP's preg_match that can process something along the lines of:
variable1=true&variable2=1,2,3&variable3="test"&variable4!=true&variable5!=4,5,6&variable!="test"
I would change to just something like json but this wouldn't support the backwards compatibility I need, any suggestions, the closest I got was something like:
/((\w+)(=|!=)("\w+"|true|false|\d+)*)/
Which is partly successful, any help would be great.
Using string functions
$string = 'variable1=true&variable2=1,2,3&variable3="test"&variable4!=true&variable5!=4,5,6&variable!="test"';
$pairs = explode('&', $string);
foreach ($pairs as $pair) {
if (strstr($pair, '!=')) {
list($key, $value) = explode('!=', $pair);
} else {
list($key, $value) = explode('=', $pair);
}
$values[$key] = $value;
}
View the output on codepad
This code first splits the string using &, so into key-value pairs.
After that, it loops through each pair and tries to split it again, first using !=, and if that fails, using =.
Using regex
preg_match_all('/((\w+)(=|!=)("\w+"|true|false|[\d\,]+)*)/', $string, $matches);
I added the brackets [...] around \d and an escaped comma \,.
There is actually a built-in function parse_str, exactly for this purpose.
There is no need for regex here.
I have this query:
list[One]=1&list[Two]=2&list[Apple]=fruit
this is the regex I use to return the values in the brackets and after the equal sign
preg_match_all('/(?<query>list\[(?<pagename>.*?)\]\=(?<parent>.*?))/',$source,$array);
returns:
One=
Two=
Apple=
Values that come after the equal sign are missing. Where's my mistake?
By the way, this query is generated with jquery's serialize(). Is there a better method to parse the values?
As I made in a comment, you may want to look in to parse_str
However, if you change the final .*? to something like [^&]* then you'll probbaly have better luck (assuming this is a GET query string (or some facsimile) as & will have to be escaped from the sequence with %26)
(?<parent>.*?) matches an empty string, so the result ist 'correct'. Try (?<parent>[^&]+) instead:
preg_match_all('/(?<query>list\[(?<pagename>.*?)\]\=(?<parent>[^&]+))/',$source,$array);
Because you use the non-greedy ? for <parent>, it's not grabbing the values. Try the other answers or if you can count on the format list[<name>]=<value> then you can avoid using regex altogether.
$query = 'list[One]=1&list[Two]=2&list[Apple]=fruit';
$pieces = explode('&', $query);
$matches = array();
foreach ($pieces as $piece) {
list($key, $value) = explode('=', $piece);
$matches[substr($key, 5, -1)] = $value;
}