php substring Issue - php

I have the following string:
$str = "ABACADAF";
I am using the following code:
$first2 = substr($str, 0, 2);
I want to get the following output:
output => `AB,AC,AD,AF`
(Every two characters separated by comma)
But the result I'm getting is not correct.
I checked the php manual but that is not helping, is there some foreach loop to iterate through all the string characters?

Not tested, but should be something along these lines:
<?php
$string = "ABACADAF";
$split = str_split($string, 2);
$implode = implode(",", $split);
echo $implode;
?>

You are looking for str_split function. You can do like this:
$sResult = join(',', str_split($sData, 2));
Alternatively, you can do it via regex:
$sResult = preg_replace('/(..)(?!$)/', '$1,', $sData);

Here's a function that you can use to output from a foreach. We're finding two capital letter matches and putting them into an array, then we implode that array() to make a string.
<?php
function splitter($string){
preg_match_all('/[A-Z]{2}/', $string, $matches);
$newstring = implode(',',$matches[0]);
return $newstring;
}
$strings = array("ABACADAF","ACABAFAC","AAABAFAD","ACACADAF");
foreach($strings as $string){
echo splitter($string)."\n";
}
?>
Output
AB,AC,AD,AF
AC,AB,AF,AC
AA,AB,AF,AD
AC,AC,AD,AF
If you're running a lot of them (millions of lines) you can use this function instead. It's much quicker.
function splitter($string){
$newstring = substr(chunk_split($string, 2, ','), 0, -1);
return $newstring;
}

You could do it like this or recursively as well.
<?php
for ($i=0; $i< strlen($str); $i=$i+3)
{
$str = substr($str,i,2).",".substr($str,3);
}
echo $str;
?>
I personally prefer the recursive implementation:
<?php
function add_comma($str)
{
return substr($str, 0, 2,).','.add_comma(subtr($str,3));
}
echo add_comma($str);
?>

While this is doable with a for loop, it is cleaner (and maybe faster), and more strait-forward in TomUnite's answer.
But since you asked...
With a for loop you could do it like this:
$withCommas = substr($string, 0, 2);
for($i=0; $i < strlen($string); $i += 2){
$withCommas+= "," . substr($string, $i, $i+2);
}

Here is the solution and Same output of your problem:
I personally tested it :
<?php
$str = "ABACADAF";
$first = substr($str, 0, 2);
$second = substr($str, 2, 2);
$third = substr($str, 4, 2);
$fourth = substr($str, 6, 2);
echo $output = $first.",".$second.",".$third.",".$fourth;
?>

Related

How to limit word count instead of character count on product short description in woocommerce? [duplicate]

How can I truncate a string after 20 words in PHP?
function limit_text($text, $limit) {
if (str_word_count($text, 0) > $limit) {
$words = str_word_count($text, 2);
$pos = array_keys($words);
$text = substr($text, 0, $pos[$limit]) . '...';
}
return $text;
}
echo limit_text('Hello here is a long sentence that will be truncated by the', 5);
Outputs:
Hello here is a long ...
Change the number 3 to the number 20 below to get the first 20 words, or pass it as parameter. The following demonstrates how to get the first 3 words: (so change the 3 to 20 to change the default value):
function first3words($s, $limit=3) {
return preg_replace('/((\w+\W*){'.($limit-1).'}(\w+))(.*)/', '${1}', $s);
}
var_dump(first3words("hello yes, world wah ha ha")); # => "hello yes, world"
var_dump(first3words("hello yes,world wah ha ha")); # => "hello yes,world"
var_dump(first3words("hello yes world wah ha ha")); # => "hello yes world"
var_dump(first3words("hello yes world")); # => "hello yes world"
var_dump(first3words("hello yes world.")); # => "hello yes world"
var_dump(first3words("hello yes")); # => "hello yes"
var_dump(first3words("hello")); # => "hello"
var_dump(first3words("a")); # => "a"
var_dump(first3words("")); # => ""
To Nearest Space
Truncates to nearest preceding space of target character. Demo
$str The string to be truncated
$chars The amount of characters to be stripped, can be overridden by $to_space
$to_space boolean for whether or not to truncate from space near $chars limit
Function
function truncateString($str, $chars, $to_space, $replacement="...") {
if($chars > strlen($str)) return $str;
$str = substr($str, 0, $chars);
$space_pos = strrpos($str, " ");
if($to_space && $space_pos >= 0)
$str = substr($str, 0, strrpos($str, " "));
return($str . $replacement);
}
Sample
<?php
$str = "this is a string that is just some text for you to test with";
print(truncateString($str, 20, false) . "\n");
print(truncateString($str, 22, false) . "\n");
print(truncateString($str, 24, true) . "\n");
print(truncateString($str, 26, true, " :)") . "\n");
print(truncateString($str, 28, true, "--") . "\n");
?>
Output
this is a string tha...
this is a string that ...
this is a string that...
this is a string that is :)
this is a string that is--
use explode() .
Example from the docs.
// Example 1
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2
note that explode has a limit function. So you could do something like
$message = implode(" ", explode(" ", $long_message, 20));
Try regex.
You need something that would match 20 words (or 20 word boundaries).
So (my regex is terrible so correct me if this isn't accurate):
/(\w+\b){20}/
And here are some examples of regex in php.
Simple and fully equiped truncate() method:
function truncate($string, $width, $etc = ' ..')
{
$wrapped = explode('$trun$', wordwrap($string, $width, '$trun$', false), 2);
return $wrapped[0] . (isset($wrapped[1]) ? $etc : '');
}
Its not my own creation, its a modification of previous posts. credits goes to karim79.
function limit_text($text, $limit) {
$strings = $text;
if (strlen($text) > $limit) {
$words = str_word_count($text, 2);
$pos = array_keys($words);
if(sizeof($pos) >$limit)
{
$text = substr($text, 0, $pos[$limit]) . '...';
}
return $text;
}
return $text;
}
If you code on Laravel just use Illuminate\Support\Str
here is example
Str::words($category->publication->title, env('WORDS_COUNT_HOME'), '...')
Hope this was helpful.
Split the string (into an array) by <space>, and then take the first 20 elements of that array.
With triple dots:
function limitWords($text, $limit) {
$word_arr = explode(" ", $text);
if (count($word_arr) > $limit) {
$words = implode(" ", array_slice($word_arr , 0, $limit) ) . ' ...';
return $words;
}
return $text;
}
Try below code,
$text = implode(' ', array_slice(explode(' ', $text), 0, 32))
echo $text;
Something like this could probably do the trick:
<?php
$words = implode(' ', array_slice(split($input, ' ', 21), 0, 20));
use PHP tokenizer function strtok() in a loop.
$token = strtok($string, " "); // we assume that words are separated by sapce or tab
$i = 0;
$first20Words = '';
while ($token !== false && $i < 20) {
$first20Words .= $token;
$token = strtok(" ");
$i++;
}
echo $first20Words;
based on 動靜能量's answer:
function truncate_words($string,$words=20) {
return preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '${1}', $string);
}
or
function truncate_words_with_ellipsis($string,$words=20,$ellipsis=' ...') {
$new = preg_replace('/((\w+\W*){'.($words-1).'}(\w+))(.*)/', '${1}', $string);
if($new != $string){
return $new.$ellipsis;
}else{
return $string;
}
}
This worked me for UNICODE (UTF8) sentences too:
function myUTF8truncate($string, $width){
if (mb_str_word_count($string) > $width) {
$string= preg_replace('/((\w+\W*|| [\p{L}]+\W*){'.($width-1).'}(\w+))(.*)/', '${1}', $string);
}
return $string;
}
Here is what I have implemented.
function summaryMode($text, $limit, $link) {
if (str_word_count($text, 0) > $limit) {
$numwords = str_word_count($text, 2);
$pos = array_keys($numwords);
$text = substr($text, 0, $pos[$limit]).'... Read More';
}
return $text;
}
As you can see it is based off karim79's answer, all that needed changing was that the if statement also needed to check against words not characters.
I also added a link to main function for convenience. So far it hsa worked flawlessly. Thanks to the original solution provider.
Here's one I use:
$truncate = function( $str, $length ) {
if( strlen( $str ) > $length && false !== strpos( $str, ' ' ) ) {
$str = preg_split( '/ [^ ]*$/', substr( $str, 0, $length ));
return htmlspecialchars($str[0]) . '…';
} else {
return htmlspecialchars($str);
}
};
return $truncate( $myStr, 50 );
Another solution :)
$aContent = explode(' ', $cContent);
$cContent = '';
$nCount = count($aContent);
for($nI = 0; ($nI < 20 && $nI < $nCount); $nI++) {
$cContent .= $aContent[$nI] . ' ';
}
trim($cContent, ' ');
echo '<p>' . $cContent . '</p>';
To limit words, am using the following little code :
$string = "hello world ! I love chocolate.";
$explode = array_slice(explode(' ', $string), 0, 4);
$implode = implode(" ",$explode);
echo $implode;
$implot will give : hello world ! I
function getShortString($string,$wordCount,$etc = true)
{
$expString = explode(' ',$string);
$wordsInString = count($expString);
if($wordsInString >= $wordCount )
{
$shortText = '';
for($i=0; $i < $wordCount-1; $i++)
{
$shortText .= $expString[$i].' ';
}
return $etc ? $shortText.='...' : $shortText;
}
else return $string;
}
Simpler than all previously posted regex techniques, just match the first n sequences of non-word followed by sequences of word characters. Making the non-word characters optional allows matching of word characters from the start of the string. Greedy word character matching ensures that consecutive word characters are never treated as individual words.
By writing \K in the pattern after matching n substrings, then matching the rest of the string (add the s pattern modifier if you need dots to match newlines), the replacement can be an empty string.
Code: (Demo)
function firstNWords(string $string, int $limit = 3) {
return preg_replace("/(?:\W*\w+){{$limit}}\K.*/", '', $string);
}
Lets assume we have the string variables $string, $start, and $limit we can borrow 3 or 4 functions from PHP to achieve this. They are:
script_tags() PHP function to remove the unnecessary HTML and PHP
tags (if there are any). This wont be necessary, if there are no HTML or PHP tags.
explode() to split the $string into an array
array_splice() to specify the number of words and where it'll start
from. It'll be controlled by vallues assigned to our $start and $limit variables.
and finally, implode() to join the array elements into your truncated
string..
function truncateString($string, $start, $limit){
$stripped_string =strip_tags($string); // if there are HTML or PHP tags
$string_array =explode(' ',$stripped_string);
$truncated_array = array_splice($string_array,$start,$limit);
$truncated_string=implode(' ',$truncated_array);
return $truncated_string;
}
It's that simple..
I hope this was helpful.
I made my function:
function summery($text, $limit) {
$words=preg_split('/\s+/', $text);
$count=count(preg_split('/\s+/', $text));
if ($count > $limit) {
$text=NULL;
for($i=0;$i<$limit;$i++)
$text.=$words[$i].' ';
$text.='...';
}
return $text;
}
function limitText($string,$limit){
if(strlen($string) > $limit){
$string = substr($string, 0,$limit) . "...";
}
return $string;
}
this will return 20 words. I hope it will help
$text='some text';
$len=strlen($text);
$limit=500;
// char
if($len>$limit){
$text=substr($text,0,$limit);
$words=explode(" ", $text);
$wcount=count($words);
$ll=strlen($words[$wcount]);
$text=substr($text,0,($limit-$ll+1)).'...';
}
function wordLimit($str, $limit) {
$arr = explode(' ', $str);
if(count($arr) <= $limit){
return $str;
}
$result = '';
for($i = 0; $i < $limit; $i++){
$result .= $arr[$i].' ';
}
return trim($result);
}
echo wordLimit('Hello Word', 1); // Hello
echo wordLimit('Hello Word', 2); // Hello Word
echo wordLimit('Hello Word', 3); // Hello Word
echo wordLimit('Hello Word', 0); // ''
I would go with explode() , array_pop() and implode(), eg.:
$long_message = "I like summer, also I like winter and cats, btw dogs too!";
$trimmed_message = explode(" ", $long_message, 5); // <-- '5' means 4 words to be returned
array_pop($trimmed_message); //removing last element from exploded array
$trimmed_message = implode(" ", $trimmed_message) . '...';
Result:
I like summer, also...
what about
chunk_split($str,20);
Entry in the PHP Manual
function limit_word($start,$limit,$text){
$limit=$limit-1;
$stripped_string =strip_tags($text);
$string_array =explode(' ',$stripped_string);
if(count($string_array)>$limit){
$truncated_array = array_splice($string_array,$start,$limit);
$text=implode(' ',$truncated_array).'...';
return($text);
}
else{return($text);}
}

How to replace string with asterisk(*) using strlen?

Hi please check my code:
<?php
$length='';
//$username="stackoverflow";
//$username="php";
$username=$_REQUEST['parameter'];
$len = strlen($username)-2;
for($i=1; $i<=$len; $i++){
$length .= "*";
}
echo $username[0].$length.substr($username, -1);
?>
Above code i am using this code is working fine. But i need to customize code.
EX- if i use stackoverflow it should be s***********w and php should be p*p
My code is working but i need to any shortcut function to customize my php code. Share your knowledge
Thanks
Your best bet is to combine strlen() with str_repeat() and substr() for the beginning and ending character. Such a function could look like this:
function obfuscate_username($username) {
if (strlen($username) < 3) {
return $username;
}
else {
return substr($username, 0, 1).str_repeat('*', strlen($username)-2).substr($username, -1);
}
}
$username=$_REQUEST['parameter'];
echo substr($username,0,1).str_repeat("*",strlen($username)-2).substr($username,-1);
Fiddle
$a = "stackoverflow";
echo substr_replace($a, str_repeat("*", strlen($a)-2), 1,strlen($a)-2);
you can try this
<?php
$str = "stackoverflow";
$len = strlen($str);
if($len>=3)
{
$new_str = $str[0].str_repeat("*", $len-2).$str[$len-1];
}
else
{
$new_str = $str;
}
echo $new_str;
?>
Example
Get length of string:
$length = strlen($string);
Get first and last character:
$first = substr("abcdef", 0, 1);
$last = substr("abcdef", -1);
Create middle of the string:
$middle = str_repeat("*", $length-2);
Final get whole string:
return $first.$middle.$last;
Simple and easy: $username[0] adds the first character, str_repeat adds a character n times and username[$len - 1] adds the last character of your string.
$username = $_REQUEST["parameter"];
$len = strlen($username);
if ($len >= 2)
return $username[0] . str_repeat("*", $len - 2) . $username[$len - 1];
else
return $username;

array_pop for string in PHP?

Pop the last x bytes of a string off the string and return it. Any classic way to do it in PHP other than a custom function like this?
function string_pop(&$str, $num) {
$pop = substr($str, - $num);
$str = substr($str, 0, strlen($str) - $num);
return $pop;
}
Maybe something like
list($str, $pop) = str_split($str, strlen($str) - $num);
EDIT: As pointed out by Gergo Erdosi, this code will only work if the $num is less than half of the length of $str. The following would work otherwise.
$arr = str_split($str, strlen($str) - $num);
$pop = array_pop($arr);
$str = implode('', $arr);
But whether or not this is more elegant than you're original function is debatable.
Not sure it's the most efficient, but here is a one liner:
list($str, $pop) = preg_split('/(?<=.{'.(strlen($str) - $num).'})/', $str, 2);

String function php

I get a string like 0699245221 and i want this result 06-99-24-52-21, do you know the best solution for this ? (Forget loop, or other, i'm sure php have got this "function".
Thank's in advance.
$string = '0699245221';
$modified_string = wordwrap($string, 2, '-', true);
http://www.php.net/manual/es/function.wordwrap.php
$str = "0699245221";
$str = wordwrap($str, 2, '-', true);
output: 06-99-24-52-21
Try this :
$str = '0699245221';
echo $res = implode("-",str_split($str, 2));
OR
$str = '0699245221';
echo $res = chunk_split ($str, 2, '-');
Second one has one issue that it adds a - at the end
Try this
<?php
$value = '0699245221';
echo $res = implode("-",str_split($value, 2));
?>
Output
06-99-24-52-21
There are many ways to do this. You could use something like this:
function addDashes($str) {
$str = str_split($str, 2);
$str = implode("-", $str);
return $str;
}
or this:
function addDashes($str) {
$str = chunk_split($string, 2, "-");
$str = substr($str, 0, -1);
return $str;
}
This is perfect solution tried and he give you the result like this 06-99-24-52-21
<?php
$str = "0699245221";
$str1= chunk_split($str,2,"-");
$str1=rtrim($str1,"-");
echo $str1;
?>

Sub-string without counting blank spaces

I want to make a sub-string, where the $count only counts letters, not spaces. This is what I have so far:
$string ="vikas tyagi php";
$string = substr($string, 0, 10);
echo $string;
Output:
vikas tyag
Desired output (I don't want to count the spaces):
vikas tyagi
How would I do this?
i want extract string with those condition
1)Base on count letter
2)Without white space
3)String limit also
Simply count the spaces and add them to the desired length of the capture:
function spaceless_substr($string, $start, $count) {
return substr($string, $start, ($count+substr_count($string, ' ', $start, $count)));
}
$string ="vikas tyagi asd sd as asd";
echo substr($string, 0, 14);
// return: "vikas tyagi a"
echo spaceless_substr($string, 0, 14);
// return: "vikas tyagi asd"
If I understand you correctly you can do it like so:
<?php
$string = "vikas tyagi";
$lettercount = strlen(str_replace(' ', '', $string));
echo $string . ' contains ' . $lettercount . ' letters';
?>
Here I've used strlen() on a version of $string with spaces removed using str_replace()
Addition
I didn't understand the question
Addition
Here's my first crack at this, feel free to amend where you see fit:
$string = "vikas tyagi";
function my_substr($string, $start, $length)
{
$substr = substr($string, $start, $length);
$spaces = count(explode(' ', $substr)) - 1;
if ($spaces > 0)
{
return substr($string, $start, $length + $spaces);
}
return $substr;
}
echo my_substr($string, 0, 10);
$arr = explode(" ",$str);
$length = 10;
for ($i = 0, $currIndex = 0, $finalstring = ""; $currIndex < $length; $i++){
$finalstring .= " ".substr($arr[$i], 0, $length - $currIndex);
$currIndex += strlen($arr[$i]);
}
Here is a demonstration: http://codepad.org/lv4KEsAi

Categories