In php is there a quick way of replacing every other character (non spaces) in a string with something else ? I searched around and haven't found a solution.
Take something like this:
$str = "This is my example string!"
And end up with something like this:
$result = "T*i* i* m* e*a*p*e s*r*n*!
Simple preg_replace() solution:
$str = "This is my example string!";
$result = preg_replace('/(\S)\S/', '$1*', $str);
print_r($result);
The output:
T*i* i* m* e*a*p*e s*r*n*!
\S - stands for non-whitespace character
You can treat the string as an array, loop through it and change the character using modulo to check for parity:
<?php
$string = "This is my test string";
$length = strlen($string);
for ($i = 0; $i < $length; $i++) {
$string[$i] = $i % 2 === 0 ? $string[$i] : "*";
}
echo $string;
Result:
T*i* *s*m* *e*t*s*r*n*
Demo
Related
I have the following string...
$string = "True is True (5-7 years)";
what I want is to get - TiT(5-7 years)
I have tried the following code but no luck...
$string = "True is True (5-7 years)";
$explodedString = explode(" ",$string);
for($i = 0; $i < 4; $i++){
$tempString = substr($explodedString[$i], 0, 1);
$finalString .= $tempString;
}
In short, I need the first three words of its initials and the remaining in bracket is as it is like this.... TiT(5-7 years). how?
This a good case for using regular expressions:
$str = 'True is True (5-7 years)';
preg_match_all('~\([^()]*\)|\b\w~', $str, $matches);
echo implode("", $matches[0]); // TiT(5-7 years)
Regex breakdown:
\([^()]*\) Match anything inside parentheses including themselves
| Or
\b\w Match first word character from a word
Your loop is going one element too far. If you want the first letter of the first 3 words, it should be $i < 3.
Then you should use array_slice() and implode() to concatenate the rest of the array.
for ($i = 0; $i < 3; $i++) {
$finalString .= $explodedString[$i][0];
}
$finalString .= implode(' ', array_slice($explodedString, 3));
DEMO
$string = "True is True (5-7 years)";
$new_string = preg_replace('/^([a-z])[a-z]+ ([a-z])[a-z]+ ([a-z])[a-z]+ (\(.+\))$/i', '$1$2$3$4', $string);
First of all.
Create an empty variable. That will be your final result
$result="";
Then youse foreach to loop your explode string.
At every part chech the first character.
If it's not ( add the first char onto the result variable.
else add the whole array element onto the result variable
foreach(explodedString as $t){
If($t[0] !="("){$result.=$t[0];} else{$result.=$t;}
}
At the end of the loop you will get what you wanted
echo $result;
How can I format an arbitrary string according to a flexible pattern? The only solution I came up with is using regular expressions, but then I need 2 "patterns" (one for the search and one for the output).
Example:
$str = '123ABC5678";
Desired output: 12.3AB-C5-67.8
I would like to use a pattern in a variable (one that a user can easily define without knowledge of regular expressions) It could look like this:
$pattern = '%%.%%%-%%-%%.%';
So the user would just have to use 2 different characters (% and .)
A solution with regex would look like this:
$str = '123ABC5678';
$pattern_src = '#(.{2})(.{3})(.{2})(.{2})(.{1})#';
$pattern_rpl = "$1.$2-$3-$4.$5";
$res = preg_replace($pattern_src, $pattern_rpl, $str);
//$res eq 12.3AB-C5-67.8
Way too complicated since the user would need to define $pattern_src and $pattern_rpl. If the string could vary in length, it would be even more complex to explain.
Yes, I could write a function/parser that builds the required regular expressions based on a simple user pattern like %%.%%%-%%-%%.%. But I wonder if there is any "built in" way to achieve this with php? I was thinking about sprintf etc., but that doesn't seem to do the trick. Any ideas?
I was thinking about sprintf etc., but that doesn't seem to do the trick.
You're on the right track. You can accomplish this with vsprintf as follows:
$str = '123ABC5678';
$pattern = '%%.%%%-%%-%%.%';
echo vsprintf(str_replace('%', '%s', $pattern), str_split($str));
Output:
12.3AB-C5-67.8
This is assuming the number of % characters in $pattern match the length of $str.
Why not write a simple parser that works as follows:
For each character of pattern:
if you match percent character, output next character from input
if you match any other character, output it
$str = '123ABC5678';
$pattern = '%%.%%%-%%-%%.%';
if (strlen($str) < substr_count($pattern, '%'))
Die('The length of input string is lower than number number of placeholders');
$len = strlen($pattern);
$stringIndex = 0;
$output = '';
for ($i = 0; $i < $len; $i++) {
if ($pattern[$i] === '%') {
$output .= $str[$stringIndex];
$stringIndex++;
} else {
$output .= $pattern[$i];
}
}
echo $output;
I have a similar solution that looks like this.
<?php
$format = '%%.%%%-%%-%%.%';
$string = '123ABC5678';
$new_string = '';
$c = 0;
for( $i = 0; $i < strlen( $format ); $i++ )
{
if( $format[ $i ] == '%' )
{
$new_string .= $string[ $c ];
$c++;
}
else
{
$new_string .= $format[ $i ];
}
}
echo $new_string;
Output:
12.3AB-C5-67.8
How about this pattern from the user?
2.3-2-2.1
Where the pattern is a number means n chars, a dot or dash means add a dot or dash.
Now you make a regex to parse the user input:
preg_match_all("/(.)/", $User_input, $pattern);
Now you will have an array with either numbers or dots and dashes.
So loop through the array and build the string:
$string = '123ABC5678';
$User_input = "2.3-2-2.1";
preg_match_all("/(.)/", $User_input, $pattern);
$i=0;
$str="";
foreach($pattern[1] as $val){
if(is_numeric($val)){
$str .= substr($string,$i,$val);
$i=$i+$val;
}else{
$str .= $val;
}
}
echo $str;
https://3v4l.org/5eg5G
I'm searching for the most elegant way in PHP to hide a string (for example an username).
For example, usernames should be shown as:
tim will be shown as: t*m
So the username itself is not completely "cryptically", but no one can guess their login name or at least not for sure.
You can use preg_replace:
$string = 'usernameTest';
echo preg_replace("/(?!^).(?!$)/", "*", $string); // u**********t
(?!^) Checks if the character is not the first character in the string.
. matches any character
(?!$) Checks if the character is not the last character in the string.
Hope this helps.
You can use the following regex along with preg_replace function like as
(^.|.$)(*SKIP)(*F)|(.)
Example
$your_string = "Narendra";
echo preg_replace("/(^.|.$)(*SKIP)(*F)|(.)/","*",$your_string);
Output :
N******a
Explanation of Regex:
(^.|.$) This'll capture the first and last alphabet of the word
(*SKIP)(*F) This'll skip the above captured words
|(.) Over here rest of the alphabets'll be captured and can be replaced further with your character i.e. * over here
Demo
Try:
function get_starred($str) {
$len = strlen($str);
return substr($str, 0, 1).str_repeat('*', $len - 2).substr($str, $len - 1, 1);
}
$myStr = 'YourName';
echo get_starred($myStr); //should show Y******e
You can do something like this for example:
<?php
function HideUN($username = "") {
$replaced = "";
# Count the characters in username and remove an extra asterik (*)
# Substring, remove all characters and leave the first one and add the last one
for($i = 0; $i < strlen($username) -1; $i++) $replaced .= "*";
return substr($username, 0, 1)."".$replaced."".substr($username, -1, 1);
}
# Call this function
$string = "John";
echo HideUN($string);
?>
The substr() removes all characters after the first one, then the for() loop, counts the characters from $string and then we gonna add the asterik (*) to an other variable called $replaced.
Then at the end we put them together in an echo. Output: J***n
function Split_Hide_Name($name) {
$name = trim($name);
$split_name = explode(' ',$name);
foreach($split_name as $v) {
$string []= strlen($v);
}
$number_of_letters_to_show = 3;
$first_name_length = $string[0];
$last_name_length = $string[count($string)-1];
$first_name1 = $split_name[0];
$last_name1 = $split_name[count($string)-1];
$fname_cover = '';
for ($i = 0; $i < $first_name_length - $number_of_letters_to_show; $i++){
$fname_cover .="*";
}
$lname_cover = '';
for ($i = 0; $i < $last_name_length - $number_of_letters_to_show; $i++){
$lname_cover .="*";
}
$first_name = substr_replace($first_name1,$fname_cover,$number_of_letters_to_show);
$last_name = substr_replace($last_name1,$lname_cover,$number_of_letters_to_show);
return $first_name.' '.$last_name;}
I have a problem regarding regular expression. Let say I have a string like this:
/media/bcd44b6a-9c2e-4496-81da-b45d3c349c91/abcd/planet/document/sola
I need to remove all the string before word sola and take the string from sola onwards. Meaning, the output it will be like this:
sola/path/anotherpath/../..
So how I'm gonna do that. Please help me. Thank you in advance.
$string="/media/bcd44b6a-9c2e-4496-81da-b45d3c349c91/abcd/planet/document/sola-asda";
echo substr($string,strpos($string,"sola")+4); // -asda
use string explode
$string1 = "your string" //url
$string2 = "the part you need"; //Sola
$string3 = ""; //string with the result;
$strings = explode($string2, $string1);
$c = count($strings);
if($c < 2){
echo "not found";
}else{
$i = 1;
while($i < $c){
$string3 .= $string2.$strings[$i];
$i++;
}
}
I'm trying strip every third character (in the example a period) below is my best guess and is close as ive gotten but im missing something, probably minor. Also would this method (if i could get it working) be better than a regex match, remove?
$arr = 'Ha.pp.yB.ir.th.da.y';
$strip = '';
for ($i = 1; $i < strlen($arr); $i += 2) {
$arr[$i] = $strip;
}
One way you can do it is:
<?php
$oldString = 'Ha.pp.yB.ir.th.da.y';
$newString = "";
for ($i = 0; $i < strlen($oldString ); $i++) // loop the length of the string
{
if (($i+1) % 3 != 0) // skip every third letter
{
$newString .= $oldString[$i]; // build up the new string
}
}
// $newString is HappyBirthday
echo $newString;
?>
Alternatively the explode() function might work, if the letter you're trying to remove is always the same one.
This might work:
echo preg_replace('/(..)./', '$1', 'Ha.pp.yB.ir.th.da.y');
To make it general purpose:
echo preg_replace('/(.{2})./', '$1', $str);
where 2 in this context means you are keeping two characters, then discarding the next.
A way of doing it:
$old = 'Ha.pp.yB.ir.th.da.y';
$arr = str_split($old); #break string into an array
#iterate over the array, but only do it over the characters which are a
#multiple of three (remember that arrays start with 0)
for ($i = 2; $i < count($arr); $i+=2) {
#remove current array item
array_splice($arr, $i, 1);
}
$new = implode($arr); #join it back
Or, with a regular expression:
$old = 'Ha.pp.yB.ir.th.da.y';
$new = preg_replace('/(..)\./', '$1', $old);
#selects any two characters followed by a dot character
#alternatively, if you know that the two characters are letters,
#change the regular expression to:
/(\w{2})\./
I'd just use array_map and a callback function. It'd look roughly like this:
function remove_third_char( $text ) {
return substr( $text, 0, 2 );
}
$text = 'Ha.pp.yB.ir.th.da.y';
$new_text = str_split( $text, 3 );
$new_text = array_map( "remove_third_char", $new_text );
// do whatever you want with new array