Sorry, I believed that this function call should only return the spaces segment: preg_filter('/^( *)/', '${0}', ' <table>...</table>') But it returns whole string ' <table>...</table>' instead of ' ' El 29/10/16 a les 09:50, Narcis Garcia ha escrit: > preg_replace('/^( *)/', '${0}', ' <table>...</table>') == > ' <table>...</table>' > > > El 29/10/16 a les 05:17, German Geek ha escrit: >> OK, in the interest of science I implemented a test: >> >> The difference in performance is absolutely minimal: >> 0.07233524322509943 micro seconds on a million iterations (0.795%). The >> regex seemed to be winning with less iterations which I didn't expect, even >> if regexes would be faster. >> >> *Conclusion: Just use regexes as string handling code can get complicated >> fast and I think more complex regexes outperform complicated string >> handling. Even just adding a character that is not trimmed by ltrim to this >> makes the string handling really hard.* >> >> Note also, that the regex here might be compiled every time, in which case >> regexes are the clear winner. I think PHP might cache the compiled regex >> though. >> >> Result: >> php regex.php >> time for string: 9.1010239124298 >> time for regex: 9.1733591556549 >> >> Code: >> <?php >> >> define('LINE_LENGTH', 80); >> define('ITERATIONS', 1000000); >> function getSpaced() { >> $amount = rand(0, LINE_LENGTH); >> $nonSpaceAmount = rand(0, LINE_LENGTH); >> $spaces = str_repeat(' ', $amount); >> $rest = ''; >> for ($i = 0; $i < $nonSpaceAmount; ++$i) { >> $rest .= chr(rand(ord('A'), ord('z'))); >> } >> return $spaces . $rest; >> } >> $start = microtime(true); >> for ($i = 0; $i < ITERATIONS; ++$i) { >> $string = getSpaced(); >> substr($string, 0, strlen($string) - strlen(ltrim($string))); >> } >> echo "time for string: " . (microtime(true) - $start) . "\n"; >> >> $start = microtime(true); >> for ($i = 0; $i < ITERATIONS; ++$i) { >> $string = getSpaced(); >> preg_match('/^( *)/', $string, $matches); >> //$matches[1]; >> } >> echo "time for regex: " . (microtime(true) - $start) . "\n"; >> >> >> On Sat, 29 Oct 2016 at 15:37 German Geek <geek.de@xxxxxxxxx> wrote: >> >>> String functions are very fast. Regexes have to be compiled under the hood >>> to take advantage of their speed. PHP does this behind the scenes. So, if >>> you are only looking for spaces it's going to run faster in my humble >>> opinion. >>> >>> However, I agree that regexes are probably better in any case, because >>> they are much more powerful and for someone who understands them, just as >>> easy to read if not easier, especially in this example. >>> >>> The difference in performance is probably not noticeable, especially not >>> nowadays. Saving developer time is more important and I would use regexes >>> as well. >>> >>> I could be wrong about regexes being slower. It's just what I read >>> somewhere. I guess one would have to do the test on a large input to verify >>> on a case by case basis. As far as I understand regexes have to perform >>> string functions also, which I think are probably more complicated than in >>> this example. Again, something to test. >>> >>> I would want to know, just out of interest though. :-) >>> >>> On Sat, 29 Oct 2016 at 12:40 Ashley Sheridan <ash@xxxxxxxxxxxxxxxxxxxx> >>> wrote: >>> >>> >>> >>> On 28 October 2016 23:33:00 BST, German Geek <geek.de@xxxxxxxxx> wrote: >>>> regex is nicer, because it is less code and you can detect any white >>>> space >>>> etc. >>>> >>>> However! >>>> >>>> substring etc will be faster and more understandable to others who do >>>> not >>>> know much about regexes. >>>> >>>> On Sat, 29 Oct 2016 at 02:21 Christoph M. Becker <cmbecker69@xxxxxx> >>>> wrote: >>>> >>>>> On 28.10.2016 at 14:51, Richard wrote: >>>>> >>>>>>> Date: Friday, October 28, 2016 12:09:31 +0100 >>>>>>> From: Ashley Sheridan <ash@xxxxxxxxxxxxxxxxxxxx> >>>>>>> >>>>>>> On 28 October 2016 12:01:16 BST, Narcis Garcia >>>>>>> <informatica@xxxxxxxxx> wrote: >>>>>>> >>>>>>>> Hello, I have a string (I quote here only) as: >>>>>>>> >>>>>>>> ' <table>...</table>' >>>>>>>> >>>>>>>> As you can see there are 3 spaces at the beginning, but it could >>>>>>>> be 0 or >>>>>>>> 4 or any number of spaces. >>>>>>>> How can I get a string with only the initial spaces part? >>>>>>>> >>>>>>>> ' <table>...</table>' -> ' ' >>>>>>>> 'hello' -> '' >>>>>>>> ' hello' -> ' ' >>>>>>>> >>>>>>>> Thanks. >>>>>>> >>>>>>> Have you tried regular expressions? Something like: >>>>>>> >>>>>>> ^( )*[^ ] >>>>>>> >>>>>>> The first captured match is the number of spaces, from 0 to any >>>>>>> amount. Not the space between the brackets and before the closing >>>>>>> square bracket >>>>>> >>>>>> You need to take into consideration that "whitespace" can be >>>> created >>>>>> by more than the simple "space" (ascii 32) character. A >>>> "[horizontal] >>>>>> tab" (ascii 9) is common, but also look at the top of php trim >>>>>> function documentation: >>>>>> >>>>>> <http://php.net/manual/en/function.trim.php> >>>>>> >>>>>> to see the characters that it handles as "whitespace". >>>>> >>>>> If general whitespace should be detected with a regexp, \s could be >>>> used. >>>>> >>>>>> While "trim" >>>>>> does the opposite of what you're after, […] >>>>> >>>>> Indeed, so one could do something like >>>>> >>>>> substr($string, 0, strlen($string) - strlen(ltrim($string))) >>>>> >>>>> I'd prefer a regexp solution, though. >>>>> >>>>> -- >>>>> Christoph M. Becker >>>>> >>>>> >>>>> -- >>>>> PHP General Mailing List (http://www.php.net/) >>>>> To unsubscribe, visit: http://www.php.net/unsub.php >>>>> >>>>> >>> >>> I really don't think performing two strlen() calls, a substr(), & an >>> ltrim() is going to be faster than a regular expression. >>> >>> I don't think you should avoid regex's because some people don't >>> understand them. It's a very simple regular expression. You wouldn't tell >>> someone to avoid PDO and use mysql_* functions because PDO is too >>> complicated for some people would you? >>> -- >>> Sent from my Android device with K-9 Mail. Please excuse my brevity. >>> >>> >> > -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php